說到aop肯定會想到切面、通知、切點等等。那什麼是通知呢?之前我一直以為我們所說的通知就是我們寫在切面中的方法,但是隨著aop認識的加深,現在發現所謂的通知不僅僅是我們寫在切面中的方法,通知方法只是通知的一部分。也就是說我們在切面中定義的通知方法會被包裝成乙個真正的通知物件。通知有五種型別、他們的繼承層次是什麼樣子?看下圖:
這五個通知都繼承abstractaspectjadvice抽象類,所以這個抽象類非常重要。advice是乙個空介面,所以就不介紹了,不過它有非常多的子介面和實現類。
abstractaspectjadvice的五個子類都沒有屬性,所以它們的屬性都在這個抽象類中。乙個物件是什麼東西,主要看它的屬性。所以乙個通知到底是什麼樣子的,那就要看看這個通知的有什麼屬性。如下圖,乙個通知有許多的屬性,為了能夠想清楚乙個通知大概是什麼樣子的,那就先看看它主要有哪些中要的屬性。
乙個通知有以下幾個中要的屬性:
①、切面的名稱(bean的名稱):也就是通知方法所在的切面
②、切面所屬型別的類物件:切面對應的class物件。
③、通知方法的名稱:方法名,不包括引數。
④、通知方法對應的method的物件:
⑤、通知方法的引數:這些引數方法乙個陣列中。
⑥、切點
我們在定義乙個切面的時候通常會在裡面定義好幾個通知,如:前置通知、後置通知等等。但是我們在包裝的時候,會將切面中的前置通知方法、切面、切點包裝成乙個aspectjbeforemethodadvice 物件。所以現在要是談到乙個通知,應該要想到乙個通知具體是什麼樣子,它應該包含它所處的切面資訊,切點資訊,還有通知方法等,我覺得只要你能想到上面的六個主要屬性,說明對通知算是了解了。
下面我把我debug時候的記錄乙個通知物件的幾個屬性和屬性值,如下:藍色為屬性名,冒號後面是屬性值。
declaringclass:class com.zcd.myaspect----->切面所屬型別的類物件。class物件
aspectname:myaspect---->切面的名字
aspectjadvicemethod: public void com.zcd.myaspect.after()------>通知方法,method物件
methodname:after---->方法名字
parametertypes: ---->通知方法的引數。
declarationorder: 5
pointcut:aspectjexpressionpointcut: () execution(* com.zcd.*.*(..))---->切點。aspectjexpressionpointcut物件
知道了乙個通知物件由什麼屬性只是了解了這個物件長什麼樣子。但這個物件能幹什麼,有什麼行為,這就需要看看它由什麼主要的方法了。
這個類的方法好像有點多,不過最最重要的方法也只有幾個。我們在切面中定義乙個通知方法就是為了讓通知方法能夠在適當的時機執行,而乙個通知物件中又包含有通知方法,那麼很有可能這個通知物件會負責這個通知方法的呼叫,也就是說在程式執行的過程會通過這個通知物件來呼叫通知方法。所以現在來看看這個通知物件是怎麼呼叫通知方法的,這一任務由哪幾個方法來完成。
一下三個方法就是為了完成通知方法的呼叫的:
①、根據這個方法的名字就知道它的任務就是呼叫通知方法了。它會在內部呼叫第三個方法。
/**②、這個第乙個方法的過載方法。* invoke the advice method.
* @param
jpmatch the joinpointmatch that matched this execution join point
* @param
returnvalue the return value from the method execution (may be null)
* @param
ex the exception thrown by the method execution (may be null)
* @return
the invocation result
* @throws
throwable in case of invocation failure
*/protected object invokeadvicemethod(joinpointmatch jpmatch, object returnvalue, throwable ex) throws
throwable
//③、這個三個方法中最重要的方法。as above, but in this case we are given the join point.
protected
object invokeadvicemethod(joinpoint jp, joinpointmatch jpmatch, object returnvalue, throwable t)
throws
throwable
protected object invokeadvicemethodwithgivenargs(object args) throwsthrowable
try
catch
(illegalargumentexception ex)
catch
(invocationtargetexception ex)
}
AOP 學習, 丟擲通知
丟擲通知 org.springframework.aop.throwsadvice 丟擲通知跟後置通知一樣是在連線點隻後執行的,不過丟擲通知只在方法丟擲乙個異常時才執行,該通知對程式執行不能做任何改變,能做的只是改變丟擲異常的型別 public class errorclass public voi...
spring(十) aop環繞通知
假如有這麼乙個場景,需要統計某個方法執行的時間,如何做呢?典型的會想到在方法執行前記錄時間,方法執行後再次記錄,得出執行的時間。如果採用spring的aop,僅僅使用前置和後置方法是無法做到的,因為他們無法共享變數。這樣通過環繞通知,就可以快捷的實現。首先在切面通知類中宣告環繞通知類 public ...
AOP的五種通知
切入點表示式語法 修飾符 返回型別 包名.類名.方法名 形式引數 常見寫法 execution public 所有的public方法 execution set 所有set開頭的方法 execution com.xyz.service.accountservice.accountservice類中的...