这里,我们设置为:-javaagent:D:\masterSpring\resources\aspectj-1.5.3\lib\aspectjweaver.jar
在Tomcat下的设置
打开<Tomcat_Home>\bin\catalina.bat,在该批处理文件头部添加以下的设置:
set JAVA_OPTS=-javaagent:D:\masterSpring\resources\aspectj-1.5.3\lib\aspectjweaver.jar
这样,Tomcat服务启动时,JVM就会使用这个参数了。
2. 配置LTW织入器的aop.xml织入配置文件
LTW织入器在工作时,首先会查找类路径下META-INF /aop.xml的配置文件,并根据配置文件的设置进行织入的操作。下面是一个简单的aop.xml文件:
在①中,通过<aspect>指定LTW织入器需要处理的切面类,这些切面类是用AspectJ语法编写的。②处通过通配符指定需要进行织入操作的目标类。通过..*将需要处理的目标类限制在项目类包下是一个比较好的方法,否则织入器将对所有类进行操作,而这并不是我们期望的行为。<aspectj>
<aspects>
<aspect name="com.baobaotao.aspectj.TestAspectJ"/> ①切面类
</aspects>
<weaver>
<include within="com.baobaotao..*"/> ② 指定需要进行织入操作的目标类范围
</weaver>
</aspectj>
AspectJ织入切面结合Spring IoC容器管理切面实例
让AspectJ为Java类提供切面织入服务,同时让目标类和切面类享受Spring IoC依赖注入功能,这样,两者是紧密地集成在一起了。
首先,我们来看一下需要AspectJ进行切面织入的目标类:
Waitress拥有一个name属性和一个serveTo()方法。现在我们需要通过AspectJ为Waitress进行切面织入,以便在侍者提供服务之前强制使用礼貌用语:package com.baobaotao;
public class Waitress ...{
private String name;
public void serveTo(String client) ...{
System.out.println(name + " serves to " + client+"...");
}
public String getName() ...{
return name;
}
public void setName(String name) ...{
this.name = name;
}
}
(注:为了能够编写AspectJ的切面,你首先需要从http://www.eclipse.org/aspectj/downloads.php下载AspectJ开发插件,以支持AspectJ语法。目前AspectJ分别为Eclipse、JBuilder、NetBeans、JDeveloper IDE.以及Emacs and JDEE提供了插件。)package com.baobaotao;
public aspect TestAspectj ...{
private pointcut traceServeTo() :execution(* serveTo(..));①切点
before(): traceServeTo() ...{②前置增强
System.out.println(message);
}
private String message; ③礼貌用语
public void setMessage(String message)...{
this.message = message;
}
}
TestAspectj切面类将对Waitress的serveTo()方法进行前置增强,在①处定义了切点,在②处定义了前置增强方法。此外,该切面类还拥有一个message属性,用于提供规范的服务前礼貌用语,我们希望通过配置,在Spring IoC容器中注入该属性。
在Spring配置文件中,我们可以按配置一般Bean相似的方式配置AspectJ切面类(TestApectj)和织入AspectJ的目标类(Waitress):
注意,配置AspectJ切面类里,需要指定factory-method="aspectOf"属性,以便确保Spring从AspectJ获取切面实例,而非自己创建该实例。<bean id="aspectj" class="com.baobaotao.ThreadAspectj" factory-method="aspectOf">
<property name="message" value="How are you!"/>
</bean>
<bean id="waitress" class="com.baobaotao.Waitress">
<property name="name" value="Katty"/>
</bean>
为了让ThreadAspectj起作用,当然我们需要调整aop.xml的配置:
运行以下的测试代码(同样的,你需要为该类设置JVM javaagent参数):<aspectj>
<aspects>
<aspect name="com.baobaotao.ThreadAspectj "/>
</aspects>
<weaver options="-showWeaveInfo
-XmessageHandlerClass:org.springframework.aop.aspectj.AspectJWeaverMessageHandler">
<include within="com.baobaotao..*" />
</weaver>
</aspectj>
控制台输出以下的信息:package com.baobaotao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class WaitressAspectjTest ...{
public static void main(String[] args) ...{
String configPath = "com/baobaotao /beans.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
Waitress waitress = (Waitress)ctx.getBean("waitress");
waitress.serveTo("Johnson");
}
}
①说明AspectJ切面织入到Waitress..serveTo()中,且礼貌用语从Spring IoC中注入
From AspectJ:How are you!
Katty serves to Johnson...
从输出信息中,我们可以知道,Spring成功地管理了AspectJ的切面,AspectJ的切面类也成功地织入到目标类中。
