AOP執行順序
如果我們在同一個方法自定義多個AOP,我們如何指定他們的執行順序呢?
可以通過指定order,order越小越是最先執行。
配置AOP執行順序的三種方式:
通過實現Ordered接口
@Component @Aspect @Slf4j public class MessageQueueAopAspect1 implements Ordered{@Override public int getOrder() { // TODO Auto-generated method stub return 2; } }
配置文件配置
<aop:config expose-proxy="true">
<aop:aspect ref="aopBean" order="0">
<aop:pointcut id="testPointcut" expression="@annotation(xxx.xxx.xxx.annotation.xxx)"/>
<aop:around pointcut-ref="testPointcut" method="doAround" />
</aop:aspect>
</aop:config>
@Order注解指定
@Component @Aspect @Slf4j @Order(1) public class MessageQueueAopAspect1{ ... }


通知的執行順序
Advice :通知,在切面的某個特定的連接點(Join point)上執行的操作。
通知分為:
前置通知:在原來方法之前執行。
后置通知:在原來的方法之后執行。特點:可以得到被增強方法的返回值。
環繞通知:在方法之前和方法之后執行。
異常通知:目標方法出現異常執行,如果方法沒有異常,不會執行。特點:可以獲得異常的信息。
最終通知:指的是無論是否有異常,總是被執行。
示例
創建兩個自定義注解

自定義注解2

定義兩個實現Ordered接口的切面,切面1的order較小,先執行

切面2

PostMan接口調用

Debug過程

F8下一步,最終結果如下

總結
spring aop就是一個同心圓,要執行的方法為圓心,最外層的order最小。從最外層按照AOP1、AOP2的順序依次執行doAround方法,doBefore方法。然后執行method方法,最后按照AOP2、AOP1的順序依次執行doAfter、doAfterReturn方法。也就是說對多個AOP來說,先before的,一定后after。

一個切面通知的順序

兩個切面通知的順序

希望本文章對您有幫助,您的轉發、點贊是我的創作動力,十分感謝。
掃描下方二維碼關注我,您會收到更多優質文章推送。

