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。
一個切面通知的順序
兩個切面通知的順序
希望本文章對您有幫助,您的轉發、點贊是我的創作動力,十分感謝。
掃描下方二維碼關注我,您會收到更多優質文章推送。