一、前置通知
在目標方法執行之前執行的通知
在前置通知方法,可以沒有引數,也可以額外接收一個JoinPoint,Spring會自動將該物件傳入,代表當前的連線點,通過該物件可以獲取目標物件和目標方法相關的資訊。注意,如果接收JoinPoint,必須保證其為方法的第一個引數,否則報錯!
配置方法:
二、環繞通知
在目標方法執行之前和之後都可以執行額外程式碼的通知。
在環繞通知中必須顯式的呼叫目標方法,否則目標方法不會執行。
這個顯式呼叫時通過ProceedingJoinPoint來實現,可以在環繞通知中接收一個此型別的形參,spring容器會自動將該物件傳入,這個引數必須處在環繞通知的第一個形參位置。
**要注意,只有環繞通知可以接收ProceedingJoinPoint,而其他通知只能接收JoinPoint。
配置方式:
環繞通知需要返回返回值,否則真正呼叫之將拿不到返回值,只能得到一個null。
環繞通知有控制目標方法是否執行、目標方法執行之前或之後執行額外程式碼、有控制是否返回值、甚至改變返回值的能力
環繞通知雖然有這樣的能力,但一定要慎用,要小心不要破壞了軟體分層的“高內聚 低耦合”的目標。
三、後置通知
在目標方法執行之後的通知。
在後置通知中也可以選擇性的接收一個JoinPoint來獲取連線點的額外資訊,但是這個引數必須處在引數列表的第一位。
在後置通知中,還可以通過配置獲取返回值
一定要保證JoinPoint處在引數列表的第一位,否則拋異常
四、異常通知
在目標方法丟擲異常時執行的通知
配置方法:
可以配置傳入JoinPoint獲取目標物件和目標方法相關資訊,但必須處在引數列表第一位,另外,還可以配置引數,讓異常通知可以接收到目標方法丟擲來的異常物件
五、最終通知
是在目標方法執行之後執行的通知。和後置通知不同的是,後置通知是在方法正常返回後執行的通知,如果方法沒有正常返回,比如說丟擲異常,則後置通知不會執行。而最終通知無論如何都會在目標方法呼叫過後執行,即使目標方法沒有正常的執行完成。另外,後置通知可以通過配置得到返回值,而最終通知無法得到。
配置方式:
最終通知也可以額外接受一個JoinPoint引數,來獲取目標物件和目標方法相關資訊,但一定要保證必須是第一個引數。
-------------------------------------------------------------LK------------------------------------------------------------------------
五種通知執行的順序
1.在目標方法沒有丟擲異常的情況下
前置通知
環繞通知的呼叫目標方法之前的程式碼 //--取決於配置順序
目標方法
環繞通知的呼叫目標方法之後的程式碼
後置通知 //--取決於配置順序
最終通知
2.在目標方法丟擲異常的情況下:
前置通知
環繞通知的呼叫目標方法之前的程式碼 //--取決於配置順序
目標方法 //丟擲異常
異常通知
最終通知
3.如果存在多個切面:
多切面執行時,採用了責任鏈設計模式
切面的配置順序決定了切面的執行過程,類似於方法呼叫的過程,在環繞通知的proceed()執行時,去執行下一個切面或如果沒有下一個切面執行目標方法,從而達成了如下的執行過程:
如果目標方法丟擲異常:
五種通知的常見使用場景