在Spring 2.0中集成AspectJ(1)

发表于:2007-06-11来源:作者:点击数: 标签:
在Java语言中,从织入切面的方式上来看,存在三种织入方式:编译期织入、类加载期织入和运行期织入。编译期织入是指在Java编译期,采用特殊的编译器,将切面织入到Java类中;而类加载期织入则指通过特殊的类加载器,在类字节码加载到JVM时,织入切面;运行期

在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 织入器类包,如下图所示:

这里,我们设置为:-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;

}

}


共4页: 1 [2] [3] [4] 下一页

原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
...