
4.4 基于XML配置开发AspectJ
AspectJ是一个基于Java语言的AOP框架。从Spring 2.0以后引入了AspectJ的支持。对于目前的Spring框架,建议开发者使用AspectJ实现Spring AOP。使用AspectJ实现Spring AOP的方式有两种,一是基于XML配置开发AspectJ,二是基于注解开发AspectJ。本节讲解基于XML配置开发AspectJ的相关知识,而基于注解开发AspectJ的相关知识将在4.5节讲解。
基于XML配置开发AspectJ是指通过XML配置文件定义切面、切入点及通知,所有这些定义都必须在<aop:config>元素内。<aop:config>元素及其子元素如表4.2所示。
表4.2 <aop:config>元素及其子元素

下面通过一个实例演示基于XML配置开发AspectJ的过程。
① 导入AspectJ框架相关的JAR包
需要向ch4应用的/WEB-INF/lib目录下导入JAR包spring-aspects-5.0.2.RELEASE.jar和aspectjweaver-1.8.13.jar。
spring-aspects-5.0.2.RELEASE.jar是Spring为AspectJ提供的实现,在Spring的包中已提供。
aspectjweaver-1.8.13.jar是AspectJ框架所提供的规范包,可以通过地址“http://mvnrepository.com/artifact/org.aspectj/aspectjweaver/1.8.13”下载。
② 创建切面类
在ch4应用的src目录下创建aspectj.xml包,在该包中创建切面类MyAspect,并在该类中编写各种类型的通知。
MyAspect的代码如下:

③ 创建配置文件,并编写相关配置
在aspectj.xml包中创建配置文件applicationContext.xml,并为<aop:config>元素及其子元素编写相关配置。
applicationContext.xml的代码如下:

在上述配置文件中,expression=“execution(* dynamic.jdk.*.*(..))”是定义切入点表达式,该切入点表达式的意思是匹配dynamic.jdk包中任意类的任意方法的执行。其中,execution(* dynamic.jdk.*.*(..))是表达式的主体,第一个*表示的是返回类型,使用*代表所有类型;dynamic.jdk表示的是需要匹配的包名,后面第二个*表示的是类名,使用*代表匹配包中所有的类;第三个*表示的是方法名,使用*表示所有方法;后面的(..)表示方法的参数,其中的“..”表示任意参数。另外,注意第一个*和包名之间有一个空格。读者如果想了解更多关于切入点表达式的配置信息,可参考Spring官方文档的切入点声明部分。
④ 创建测试类
在aspectj.xml包中创建测试类XMLAspectJTest,在主方法中使用Spring容器获取代理对象,并执行目标方法。
XMLAspectJTest的代码如下:

上述测试类的运行结果如图4.4所示。

图4.4 基于XML配置开发AspectJ的运行结果
异常通知得到执行,需要在dynamic.jdk.TestDaoImpl类的save方法中添加异常代码,例如“int n=100/0;”,然后重新运行测试类,运行结果如图4.5所示。

图4.5 异常通知执行结果
从图4.4和图4.5可以看出各类型通知与目标方法的执行过程,具体过程如图4.6所示。

图4.6 各类型通知的执行过程