JAVA-Spring AOP五大通知型別

Mr丶L發表於2019-08-02

一、前置通知

    在目標方法執行之前執行的通知

    在前置通知方法,可以沒有引數,也可以額外接收一個JoinPoint,Spring會自動將該物件傳入,代表當前的連線點,通過該物件可以獲取目標物件和目標方法相關的資訊。注意,如果接收JoinPoint,必須保證其為方法的第一個引數,否則報錯!

    配置方法:

    

二、環繞通知

    在目標方法執行之前之後都可以執行額外程式碼的通知。

    在環繞通知中必須顯式的呼叫目標方法,否則目標方法不會執行。

    這個顯式呼叫時通過ProceedingJoinPoint來實現,可以在環繞通知中接收一個此型別的形參,spring容器會自動將該物件傳入,這個引數必須處在環繞通知的第一個形參位置。

    **要注意,只有環繞通知可以接收ProceedingJoinPoint,而其他通知只能接收JoinPoint。

    配置方式:

      

    環繞通知需要返回返回值,否則真正呼叫之將拿不到返回值,只能得到一個null。

    環繞通知有控制目標方法是否執行、目標方法執行之前或之後執行額外程式碼、有控制是否返回值、甚至改變返回值的能力

    環繞通知雖然有這樣的能力,但一定要慎用,要小心不要破壞了軟體分層的“高內聚   低耦合”的目標。

 

三、後置通知

    在目標方法執行之後的通知。

    在後置通知中也可以選擇性的接收一個JoinPoint來獲取連線點的額外資訊,但是這個引數必須處在引數列表的第一位。

    

 

 

 

     在後置通知中,還可以通過配置獲取返回值

    

    一定要保證JoinPoint處在引數列表的第一位,否則拋異常

    

四、異常通知

    在目標方法丟擲異常時執行的通知

    配置方法:

      

    可以配置傳入JoinPoint獲取目標物件和目標方法相關資訊,但必須處在引數列表第一位,另外,還可以配置引數,讓異常通知可以接收到目標方法丟擲來的異常物件

    

 

五、最終通知

    是在目標方法執行之後執行的通知。和後置通知不同的是,後置通知是在方法正常返回後執行的通知,如果方法沒有正常返回,比如說丟擲異常,則後置通知不會執行。而最終通知無論如何都會在目標方法呼叫過後執行,即使目標方法沒有正常的執行完成。另外,後置通知可以通過配置得到返回值,而最終通知無法得到。

    配置方式:

        

      最終通知也可以額外接受一個JoinPoint引數,來獲取目標物件和目標方法相關資訊,但一定要保證必須是第一個引數。

    

 

 -------------------------------------------------------------LK------------------------------------------------------------------------

五種通知執行的順序

  1.在目標方法沒有丟擲異常的情況下

    前置通知

    環繞通知的呼叫目標方法之前的程式碼   //--取決於配置順序

    目標方法

    環繞通知的呼叫目標方法之後的程式碼

    後置通知              //--取決於配置順序

    最終通知

  2.在目標方法丟擲異常的情況下:

    前置通知

    環繞通知的呼叫目標方法之前的程式碼  //--取決於配置順序

    目標方法    //丟擲異常

    異常通知

    最終通知

  3.如果存在多個切面:

    多切面執行時,採用了責任鏈設計模式

    切面的配置順序決定了切面的執行過程,類似於方法呼叫的過程,在環繞通知的proceed()執行時,去執行下一個切面或如果沒有下一個切面執行目標方法,從而達成了如下的執行過程:

    

 

    如果目標方法丟擲異常:

    

 

 

五種通知的常見使用場景

    

 

相關文章