JAVA-Spring AOP五大通知類型

1、前置通知

在目標方法執行以前執行的通知spring

在前置通知方法,能夠沒有參數,也能夠額外接收一個JoinPoint,Spring會自動將該對象傳入,表明當前的鏈接點,經過該對象能夠獲取目標對象和目標方法相關的信息。 注意,若是接收JoinPoint,必須保證其爲方法的第一個參數,不然報錯!設計模式

配置方法:設計

2、環繞通知

在目標方法執行 以前 以後 均可以執行額外代碼的通知。3d

在環繞通知中必須顯式的調用目標方法,不然目標方法不會執行。cdn

這個顯式調用時經過ProceedingJoinPoint來實現,能夠在環繞通知中接收一個此類型的形參,spring容器會自動將該對象傳入,這個參數必須處在環繞通知的第一個形參位置。對象

**要注意,只有環繞通知能夠接收ProceedingJoinPoint,而其餘通知只能接收JoinPoint。
blog

配置方式:it

環繞通知須要返回返回值,不然真正調用之將拿不到返回值,只能獲得一個null。io

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

環繞通知雖然有這樣的能力,但必定要慎用,要當心不要破壞了軟件分層的「高內聚 低耦合」的目標。

3、後置通知

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

在後置通知中也能夠選擇性的接收一個JoinPoint來獲取鏈接點的額外信息,可是這個參數必須處在參數列表的第一位。

在後置通知中,還能夠經過配置獲取返回值

必定要保證JoinPoint處在參數列表的第一位,不然拋異常

4、異常通知

在目標方法拋出異常時執行的通知

配置方法:

能夠配置傳入JoinPoint獲取目標對象和目標方法相關信息, 但必須處在參數列表第一位 ,另外,還能夠配置參數,讓異常通知能夠接收到目標方法拋出來的異常對象

5、最終通知

是在目標方法執行以後執行的通知。和後置通知不一樣的是,後置通知是在方法正常返回後執行的通知,若是方法沒有正常返回,好比說拋出異常,則後置通知不會執行。而最終通知不管如何都會在目標方法調用事後執行,即便目標方法沒有正常的執行完成。另外,後置通知能夠經過配置獲得返回值,而最終通知沒法獲得。

配置方式:

最終通知也能夠額外接受一個JoinPoint參數,來獲取目標對象和目標方法相關信息,但必定要保證 必須是第一個參數。

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

五種通知執行的順序

1.在目標方法沒有拋出異常的狀況下

前置通知

環繞通知的調用目標方法以前的代碼 //--取決於配置順序

目標方法

環繞通知的調用目標方法以後的代碼

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

最終通知

2.在目標方法拋出異常的狀況下:

前置通知

環繞通知的調用目標方法以前的代碼 //--取決於配置順序

目標方法 //拋出異常

異常通知

最終通知

3.若是存在多個切面:

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

切面的配置順序決定了切面的執行過程,相似於方法調用的過程,在環繞通知的proceed()執行時,去執行下一個切面或若是沒有下一個切面執行目標方法,從而達成了以下的執行過程:

若是目標方法拋出異常:

五種通知的常見使用場景

相關文章
相關標籤/搜索