Spring-AOP链式调用@After、@Before、@AfterReturning、@Around、@AfterThrowing
代理对象调用流程
Before
在某连接点(JoinPoint)——核心代码(类或者方法)之前执行的通知,但这个通知不能阻止连接点前的执行。为啥不能阻止线程进入核心代码呢?因为@Before注解的方法入参不能传ProceedingJoinPoint,而只能传入JoinPoint。要知道从aop走到核心代码就是通过调用ProceedingJionPoint的proceed()方法。而JoinPoint没有这个方法
@After
后通知(After advice) :当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)
@AfterReturning
返回后通知(After return advice) :在某连接点正常完成后执行的通知,不包括抛出异常的情况
@Around
环绕通知(Around advice) :包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。这时aop的最重要的,最常用的注解。用这个注解的方法入参传的是ProceedingJionPoint pjp,可以决定当前线程能否进入核心方法中——通过调用pjp.proceed();
@AfterThrowing
抛出异常后通知(After throwing advice) : 在方法抛出异常退出时执行的通知。
流程
一个方法被一个Aspect拦截
一个方法被多个Aspect拦截
执行顺序是未知的,需要指定Order才能确定优先级
- 实现org.springframework.core.Ordered接口,实现它的getOrder()方法
- 给aspect添加@Order注解,该注解全称为:org.springframework.core.annotation.Order
值越小的Aspect优先执行
https://blog.csdn.net/zhanglf02/article/details/78132304
https://blog.csdn.net/rainbow702/article/details/52185827