在目標方法執行以前執行的通知spring
在前置通知方法,能夠沒有參數,也能夠額外接收一個JoinPoint,Spring會自動將該對象傳入,表明當前的鏈接點,經過該對象能夠獲取目標對象和目標方法相關的信息。 注意,若是接收JoinPoint,必須保證其爲方法的第一個參數,不然報錯!設計模式
配置方法:設計
在目標方法執行 以前 和 以後 均可以執行額外代碼的通知。3d
在環繞通知中必須顯式的調用目標方法,不然目標方法不會執行。cdn
這個顯式調用時經過ProceedingJoinPoint來實現,能夠在環繞通知中接收一個此類型的形參,spring容器會自動將該對象傳入,這個參數必須處在環繞通知的第一個形參位置。對象
**要注意,只有環繞通知能夠接收ProceedingJoinPoint,而其餘通知只能接收JoinPoint。
blog
配置方式:it
環繞通知須要返回返回值,不然真正調用之將拿不到返回值,只能獲得一個null。io
環繞通知有控制目標方法是否執行、目標方法執行以前或以後執行額外代碼、有控制是否返回值、甚至改變返回值的能力class
環繞通知雖然有這樣的能力,但必定要慎用,要當心不要破壞了軟件分層的「高內聚 低耦合」的目標。
在目標方法執行以後的通知。
在後置通知中也能夠選擇性的接收一個JoinPoint來獲取鏈接點的額外信息,可是這個參數必須處在參數列表的第一位。
在後置通知中,還能夠經過配置獲取返回值
必定要保證JoinPoint處在參數列表的第一位,不然拋異常
4、異常通知
在目標方法拋出異常時執行的通知
配置方法:
能夠配置傳入JoinPoint獲取目標對象和目標方法相關信息, 但必須處在參數列表第一位 ,另外,還能夠配置參數,讓異常通知能夠接收到目標方法拋出來的異常對象
是在目標方法執行以後執行的通知。和後置通知不一樣的是,後置通知是在方法正常返回後執行的通知,若是方法沒有正常返回,好比說拋出異常,則後置通知不會執行。而最終通知不管如何都會在目標方法調用事後執行,即便目標方法沒有正常的執行完成。另外,後置通知能夠經過配置獲得返回值,而最終通知沒法獲得。
配置方式:
最終通知也能夠額外接受一個JoinPoint參數,來獲取目標對象和目標方法相關信息,但必定要保證 必須是第一個參數。
-------------------------------------------------------------LK------------------------------------------------------------------------
五種通知執行的順序
1.在目標方法沒有拋出異常的狀況下
前置通知
環繞通知的調用目標方法以前的代碼 //--取決於配置順序
目標方法
環繞通知的調用目標方法以後的代碼
後置通知//--取決於配置順序
最終通知
2.在目標方法拋出異常的狀況下:
前置通知
環繞通知的調用目標方法以前的代碼 //--取決於配置順序
目標方法 //拋出異常
異常通知
最終通知
3.若是存在多個切面:
多切面執行時,採用了責任鏈設計模式
切面的配置順序決定了切面的執行過程,相似於方法調用的過程,在環繞通知的proceed()執行時,去執行下一個切面或若是沒有下一個切面執行目標方法,從而達成了以下的執行過程: