转 Spring AOP @Before @Around @After 等 advice 的执行顺序

转自:http://blog.csdn.net/rainbow702/article/details/52185827

情况一: 一个方法只被一个Aspect类拦截

正常情况: 
one-ok


异常情况: 
one-exception

情况二: 同一个方法被多个Aspect类拦截

方法有两种:

  • 实现org.springframework.core.Ordered接口,实现它的getOrder()方法
  • 给aspect添加@Order注解,该注解全称为:org.springframework.core.annotation.Order
@Order(5)
@Component
@Aspect
public class Aspect1 {
    // ...
}

@Order(6)
@Component
@Aspect
public class Aspect2 {
    // ...
}

注意点

  • 如果在同一个 aspect 类中,针对同一个 pointcut,定义了两个相同的 advice(比如,定义了两个 @Before),那么这两个 advice 的执行顺序是无法确定的,哪怕你给这两个 advice 添加了 @Order 这个注解,也不行。这点切记。

  • 对于@Around这个advice,不管它有没有返回值,但是必须要方法内部,调用一下 pjp.proceed();否则,Controller 中的接口将没有机会被执行,从而也导致了 @Before这个advice不会被触发。

原文地址:https://www.cnblogs.com/bluedeblog/p/7522355.html