技术开发 频道

在Spring 2.0中集成AspectJ



    【IT168 专稿】在Java语言中,从织入切面的方式上来看,存在三种织入方式:编译期织入、类加载期织入和运行期织入。编译期织入是指在Java编译期,采用特殊的编译器,将切面织入到Java类中;而类加载期织入则指通过特殊的类加载器,在类字节码加载到JVM时,织入切面;运行期织入则是采用CGLib工具或JDK动态代理进行切面的织入。

    AspectJ采用编译期织入和类加载期织入的方式织入切面,是语言级的AOP实现,提供了完备的AOP支持。它用AspectJ语言定义切面,在编译期或类加载期将切面织入到Java类中。 

    在低版本的Spring中,你只能通过接口定义切面,在Spring 2.0中你可以通过AspectJ
的切点表达式语法定义切点,Spring 2.0采用AspectJ的解析包解析切点织入切面。但这并不是我们这篇文章要讲的内容。在这篇文章里,我们希望从更高的层面上集成Spring和AspectJ,直接采用AspectJ织入切面,并让Spring IoC容器管理切面实例。
Spring AOP提供了有限的AOP支持,在一般情况下,这些支持已经能够满足我们的开发要求,但如果对AOP有更高的要求(如实例化切面、属性访问切面等),则需要使用AspectJ的支持,而AspectJ又可以利用Spring IoC的依赖注入能力,两者相得益彰,琴瑟合鸣。

    如何使用AspectJ LTW

    我们前面提到过,AspectJ提供了两种切面织入方式,第一种通过特殊编译器,在编译期,将AspectJ语言编写的切面类织入到Java类中,可以通过一个Ant或Maven任务来完成这个操作;第二种方式是类加载期织入,也简称为LTW(Load Time Weaving)。这里,我们只介绍LTW的织入,编译期织入请参看:http://www.eclipse.org/aspectj/doc/released/devguide/antTasks.html。 
    使用AspectJ LTW有两个主要步骤,第一,通过JVM的-javaagent参数设置LTW的织入器类包,以代理JVM默认的类加载器;第二,LTW织入器需要一个aop.xml文件,在该文件中指定切面类和需要进行切面织入的目标类。下面,我们来了解一下具体的做法: 
    1. 一般情况下,我们不会直接在DOS窗口中,通过Java命令启动应用或进行测试。这就要求我们在IDE环境下,或应用部署的环境下,设置JVM的参数。我们以Eclipse和Tomcat为例,分别讲述IDE和Web应用服务器中设置-javaapent JVM参数的方法。
    在Eclipse下的设置
    在Eclipse中,如果我们要改变JVM参数,可以在项目类导航树中选中某个可运行类->右键单击->Run As->Run...,可以在弹出的Run设置窗口设置该类的各项运行属性,切换到Arguments Tab页,在VM arguments中通过-javaagent指定AspectJ 织入器类包,如下图所示:


0
相关文章