Spring--AOP、通知的執行順序


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。

一個切面通知的順序

 兩個切面通知的順序

 

希望本文章對您有幫助,您的轉發、點贊是我的創作動力,十分感謝。

掃描下方二維碼關注我,您會收到更多優質文章推送。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM