我们都知道,Spring AOP中常用的拦截注解有@Before,@Around,@After。
那么问题来了,你知道他们的执行顺序是怎样的吗?恐怕这个问题还是有很多同学回答不上来,没关系,阅读完本文你就知道啦。
先上结论:
一个方法只被一个Aspect类拦截
在一个方法只被一个aspect类拦截时,aspect类内部的advice将按照以下的顺序进行执行:
正常流程

异常流程
注意,这里的图有误,执行完method触发异常之后,是转到After去执行

同一个方法被多个Aspect类拦截
这种情况下,aspect1和aspect2的执行顺序是未知的。
为了指定每个aspect的执行顺序,可以使用两种方法:
- 实现
org.springframework.core.Ordered接口,实现它的getOrder()方法 - 给
aspect添加@Order注解,该注解全称为:org.springframework.core.annotation.Order
不管采用上面的哪种方法,都是值越小的aspect越先执行。

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