使用 AspectJ 开发 AOP 通常有两种方式:
基于 XML 的声明式。
基于 Annotation 的声明式。
接下来将对这两种 AOP 的开发方式进行讲解。
基于XML的声明式
基于 XML 的声明式是指通过 Spring 配置文件的方式定义切面、切入点及声明通知,而所有的切面和通知都必须定义在 <aop:config> 元素中。
下面通过案例演示 Spring 中如何使用基于 XML 的声明式实现 AOP 的开发。
1. 导入 JAR 包
使用 AspectJ 除了需要导入 Spring AOP 的 JAR 包以外,还需要导入与 AspectJ 相关的 JAR 包,具体如下。
spring-aspects-3.2.13.RELEASE.jar:Spring 为 AspectJ 提供的实现,在 Spring 的包中已经提供。
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar:是 AspectJ 提供的规范,可以在官方网址 https://repo.spring.io/webapp/#/search/quick/ 中搜索并下载。
2. 创建切面类 MyAspect
在 src 目录下创建一个名为 com.mengma.aspectj.xml 的包,在该包下创建切面类 MyAspect,编辑后如下所示。
package com.mengma.aspectj.xml;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;//切面类public class MyAspect {// 前置通知public void myBefore(JoinPoint joinPoint) {System.out.print("前置通知,目标:");System.out.print(joinPoint.getTarget() + "方法名称:");System.out.println(joinPoint.getSignature().getName());}// 后置通知public void myAfterReturning(JoinPoint joinPoint) {System.out.print("后置通知,方法名称:" + joinPoint.getSignature().getName());}// 环绕通知public Object myAround(ProceedingJoinPoint proceedingJoinPoint)throws Throwable {System.out.println("环绕开始"); // 开始Object obj = proceedingJoinPoint.proceed(); // 执行当前目标方法System.out.println("环绕结束"); // 结束return obj;}// 异常通知public void myAfterThrowing(JoinPoint joinPoint, Throwable e) {System.out.println("异常通知" + "出错了" + e.getMessage());}// 最终通知public void myAfter() {System.out.println("最终通知");}}
上述代码中,分别定义了几种不同的通知类型方法,在这些方法中,通过 JoinPoint 参数可以获得目标对象的类名、目标方法名和目标方法参数等。需要注意的是,环绕通知必须接收一个类型为 ProceedingJoinPoint 的参数,返回值必须是 Object 类型,且必须抛出异常。异常通知中可以传入 Throwable 类型的参数,用于输出异常信息。