参考:https://cloud.tencent.com/developer/article/2206849
一:SpringAOP应用场景
给类的方法做增强处理:加打印日志的操作等
二:SpringAOP原理
JDK动态代理、 Cglib动态代理(都是通过反射实现的)
Spring会自动在JDK动态代理和CGLIB之间转换:主要看类实现了接口、或是普通类(就算实现了接口也可以设置使用Cglib)
JDK动态代理、 Cglib动态代理解析链接
三:SpringAOP 五个通知: 相当于是动态代理里面的委托类里面在目标方法前后添加的方法
@Around: 环绕通知,这是功能最强大的Advice,可以自定义执行顺序
@Before: 前置通知,在被切的方法执行前执行
@AfterRunning: 返回通知,在被切的方法return后执行
@AfterThrowing: 异常通知,在被切的方法抛异常时执行
@After:后置通知,在被切的方法执行后执行,比return更后
@Aspect
@Component
public class SpringAopExample {
@Pointcut(value = "execution(* com.qiuridong.do*(..))")
private void myPointCut() {
//无需代码
}
@Around(value = "myPointCut()")
public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕通知中前置通知的功能....");
Object obj = joinPoint.proceed();
System.out.println("环绕通知中后置通知的功能....");
return obj;
}
@Before(value = "myPointCut()")
public void myBefore() {
System.out.println("前置通知,在目标方法之前先执行的....");
}
@AfterReturning(value = "myPointCut()", returning = "obj")
public void myAfterReturning(Object obj) {
System.out.println("后置通知,在目标方法之后再执行的(如有异常,则后置通知不会执行).... 目标方法返回值:" + obj);
}
@After(value = "myPointCut()")
public void myAfter() {
System.out.println("最终通知,总是会被执行的....");
}
@AfterThrowing(value = "myPointCut()", throwing = "e")
public void myAfterThrowing(Exception e) {
System.out.println("异常通知,在目标方法抛出异常时执行的,异常原因是:" + e.getMessage());
}
}
四:多个aop执行顺序: order的值越小优先级越高
1.通常使用@Order 注解:直接定义顺序:值越小优先级越高
// 值越小优先级越高
@Order(3)
@Component
@Aspect
public class LoggingAspect implements Ordered {
2.实现Ordered 接口重写 getOrder 方法: 值越小优先级越高
@Component
@Aspect
public class LoggingAspect implements Ordered {
@Override
public int getOrder() {
// 返回值越小优先级越高
return 1;
}
}
AOP1: 1
AOP2: 2