AspectJ是基于java语言实现的AOP框架。使用AspectJ实现Spring AOP有两种方式:基于XML配置开发AspectJ 和 基于注解开发AspectJ。
基于XML配置开发AspectJ
基于XML配置是指 通过XML配置文件定义切面、切入点及通知,所有的定义必须在< aop:config>元素内完成。
元素名称 | 用途 |
---|---|
< aop:config> | 开发AspectJ的顶层配置元素,在配置文件的< beans>可以包含多个该元素 |
< aop:aspect> | 配置一个切面,是< aop:config>的子元素,属性ref指定定义切面的bean |
< aop:pointcut> | 配置切入点,< aop:aspect>的子元素,属性expression指定通知增强的哪些方法 |
< aop:before> | 配置前置通知,< aop:aspect>的子元素 ,实现method指定前置通知方法,属性pointcut-ref指定关联的切入点 |
< aop:after-returning> | 配置后置返回通知,< aop:aspect>的子元素 ,实现method指定后置返回通知方法,属性pointcut-ref指定关联的切入点,目标方法成功执行后执行 |
< aop:around> | 配置环绕通知,< aop:aspect>的子元素 ,实现method指定环绕通知方法,属性pointcut-ref指定关联的切入点 |
< aop:after-throwing> | 配置异常通知,< aop:aspect>的子元素 ,实现method指定异常通知方法,属性pointcut-ref指定关联的切入点 ,没有异常时不会执行 |
< aop:after> | 配置最终通知,< aop:aspect>的子元素 ,实现method指定最终通知方法,属性pointcut-ref指定关联的切入点,不管是否发生异常都要执行 |
在使用AspectJ实现Spring AOP时,需要用到的jar包有:
- spring-aop.jar
- spring-aspects.jar
- aspectjweaver.jar
编写切面类 :
package gzc.aspectj.xml;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* 切面类 ,在此类中编写各种类型通知
*/
public class MyAspectJ {
// 前置通知,使用JoinPoint接口作为参数获得目标对象
public void before(JoinPoint jp) {
System.out.print("前置通知:模拟权限控制");
System.out.println(",目标对象:" + jp.getTarget() + ",被增强的方法:" + jp.getSignature().getName());
}
// 后置返回通知 , 目标方法成功执行后才执行
public void afterReturning(JoinPoint jp) {
System.out.print("后置返回通知:模拟缓存清理");
System.out.println(",目标对象:" + jp.getTarget() + ",被增强的方法:" + jp.getSignature().getName());
}
/*
* 环绕通知 ProceedingJoinPoint 是JoinPoint的子接口,代表可以执行的目标方法 返回值类型必须是Object
* 必须一个参数是ProceedingJoinPoint类型 必须throws Throwable
*/
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Object obj = null