技术开发 频道

在Spring 2.0中集成AspectJ



    这里,我们设置为:-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文件:
<aspectj> <aspects> <aspect name="com.baobaotao.aspectj.TestAspectJ"/> ①切面类 </aspects> <weaver> <include within="com.baobaotao..*"/> ② 指定需要进行织入操作的目标类范围 </weaver> </aspectj>
    在①中,通过<aspect>指定LTW织入器需要处理的切面类,这些切面类是用AspectJ语法编写的。②处通过通配符指定需要进行织入操作的目标类。通过..*将需要处理的目标类限制在项目类包下是一个比较好的方法,否则织入器将对所有类进行操作,而这并不是我们期望的行为。

    AspectJ织入切面结合Spring IoC容器管理切面实例

    让AspectJ为Java类提供切面织入服务,同时让目标类和切面类享受Spring IoC依赖注入功能,这样,两者是紧密地集成在一起了。
    首先,我们来看一下需要AspectJ进行切面织入的目标类:
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; } }
    Waitress拥有一个name属性和一个serveTo()方法。现在我们需要通过AspectJ为Waitress进行切面织入,以便在侍者提供服务之前强制使用礼貌用语:
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; } }
    (注:为了能够编写AspectJ的切面,你首先需要从http://www.eclipse.org/aspectj/downloads.php下载AspectJ开发插件,以支持AspectJ语法。目前AspectJ分别为Eclipse、JBuilder、NetBeans、JDeveloper IDE.以及Emacs and JDEE提供了插件。)
    TestAspectj切面类将对Waitress的serveTo()方法进行前置增强,在①处定义了切点,在②处定义了前置增强方法。此外,该切面类还拥有一个message属性,用于提供规范的服务前礼貌用语,我们希望通过配置,在Spring IoC容器中注入该属性。
在Spring配置文件中,我们可以按配置一般Bean相似的方式配置AspectJ切面类(TestApectj)和织入AspectJ的目标类(Waitress):
<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>
    注意,配置AspectJ切面类里,需要指定factory-method="aspectOf"属性,以便确保Spring从AspectJ获取切面实例,而非自己创建该实例。
    为了让ThreadAspectj起作用,当然我们需要调整aop.xml的配置:
<aspectj> <aspects> <aspect name="com.baobaotao.ThreadAspectj "/> </aspects> <weaver options="-showWeaveInfo -XmessageHandlerClass:org.springframework.aop.aspectj.AspectJWeaverMessageHandler"> <include within="com.baobaotao..*" /> </weaver> </aspectj>
    运行以下的测试代码(同样的,你需要为该类设置JVM javaagent参数):
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的切面类也成功地织入到目标类中。
0
相关文章