知己海記憶體
2016-11-24 10:17
1切入點表示式
1.1作用
通過表示式的方式定位乙個或多個具體的連線點。
1.2語法細節
①切入點表示式的語法格式
execution([許可權修飾符] [返回值型別] [簡單類名/全類名] [方法名]([引數列表]))
②舉例說明
表示式execution(*com.atguigu.spring.arithmeticcalculator.*(..))
含義arithmeticcalculator介面中宣告的所有方法。第乙個「*」代表任意修飾符及任意返回值。第二個「*」代表任意方法。「..」匹配任意數量、任意型別的引數。若目標類、介面與該切面類在同乙個包中可以省略包名。
表示式execution(public* arithmeticcalculator.*(..))
含義arithmeticcalculator介面的所有公有方法
表示式execution(publicdoublearithmeticcalculator.*(..))
含義arithmeticcalculator介面中返回double型別數值的方法
表示式execution(public double arithmeticcalculator.*(double, ..))
含義第乙個引數為double型別的方法。「..」 匹配任意數量、任意型別的引數。
表示式execution(public double arithmeticcalculator.*(double,double))
含義引數型別為double,double型別的方法
③在aspectj中,切入點表示式可以通過 「&&」、「||」、「!」等操作符結合起來。
表示式execution (* *.add(int,..))||execution(* *.sub(int,..))
含義任意類中第乙個引數為int型別的add方法或sub方法
1.3切入點表示式應用到實際的切面類中
2當前連線點細節
2.1概述
切入點表示式通常都會是從巨集觀上定位一組方法,和具體某個通知的註解結合起來就能夠確定對應的連線點。那麼就乙個具體的連線點而言,我們可能會關心這個連線點的一些具體資訊,例如:當前連線點所在方法的方法名、當前傳入的引數值等等。這些資訊都封裝在joinpoint介面的例項物件中。
3通知3.1概述
l在具體的連線點上要執行的操作。
l乙個切面可以包括乙個或者多個通知。
l通知所使用的註解的值往往是切入點表示式。
3.2前置通知
l前置通知:在方法執行之前執行的通知
l使用@before註解
3.3後置通知
l後置通知:後置通知是在連線點完成之後執行的,即連線點返回結果或者丟擲異常的時候
l使用@after註解
3.4返回通知
l返回通知:無論連線點是正常返回還是丟擲異常,後置通知都會執行。如果只想在連線點返回的時候記錄日誌,應使用返回通知代替後置通知。
l使用@afterreturning註解
l在返回通知中訪問連線點的返回值
ø在返回通知中,只要將returning屬性新增到@afterreturning註解中,就可以訪問連線點的返回值。該屬性的值即為用來傳入返回值的引數名稱
ø必須在通知方法的簽名中新增乙個同名引數。在執行時spring aop會通過這個引數傳遞返回值
ø原始的切點表示式需要出現在pointcut屬性中
3.5異常通知
l異常通知:只在連線點丟擲異常時才執行異常通知
l將throwing屬性新增到@afterthrowing註解中,也可以訪問連線點丟擲的異常。throwable是所有錯誤和異常類的頂級父類,所以在異常通知方法可以捕獲到任何錯誤和異常。
l如果只對某種特殊的異常型別感興趣,可以將引數宣告為其他異常的引數型別。然後通知就只在丟擲這個型別及其子類的異常時才被執行
3.6環繞通知
l環繞通知是所有通知型別中功能最為強大的,能夠全面地控制連線點,甚至可以控制是否執行連線點。
l對於環繞通知來說,連線點的引數型別必須是proceedingjoinpoint。它是 joinpoint的子介面,允許控制何時執行,是否執行連線點。
l在環繞通知中需要明確呼叫proceedingjoinpoint的proceed()方法來執行被**的方法。如果忘記這樣做就會導致通知被執行了,但目標方法沒有被執行。
注意:環繞通知的方法需要返回目標方法執行之後的結果,即呼叫
ljoinpoint.proceed();的返回值,否則會出現空指標異常。
3.7重用切入點定義
l在編寫aspectj切面時,可以直接在通知註解中書寫切入點表示式。但同乙個切點表示式可能會在多個通知中重複出現。
l在aspectj切面中,可以通過@pointcut註解將乙個切入點宣告成簡單的方法。切入點的方法體通常是空的,因為將切入點定義與應用程式邏輯混在一起是不合理的。
l切入點方法的訪問控制符同時也控制著這個切入點的可見性。如果切入點要在多個切面中共用,最好將它們集中在乙個公共的類中。在這種情況下,它們必須被宣告為public。在引入這個切入點時,必須將類名也包括在內。如果類沒有與這個切面放在同乙個包中,還必須包含包名。
l其他通知可以通過方法名稱引入該切入點
3.8指定切面的優先順序
l在同乙個連線點上應用不止乙個切面時,除非明確指定,否則它們的優先順序是不確定的。
l切面的優先順序可以通過實現ordered介面或利用@order註解指定。
l實現ordered介面,getorder()方法的返回值越小,優先順序越高。
l若使用@order註解,序號出現在註解中
Spring框架AOP原理
aop aspect oriented programming 意思就是面相切面程式設計。通俗來說就是一種在通過預編譯方式和執行期間動態 實現程式功能的統一維護的一種技術,這種在執行時,動態的將 切入到類的指定方法 指定位置上的程式設計思想就是面向切面程式設計,aop通過一系列的 來實現的。說到底,...
Spring複習 六 之AOP細節
通過表示式的方式定位乙個或多個具體的連線點。切入點表示式的語法格式 execution 許可權修飾符 返回值型別 簡單類名 全類名 方法名 引數列表 記住兩種 我們要切入的位置滿足這兩個表示式 mymathcalculator.add int,double execution public int ...
spring框架中的AOP
在spring框架中學習與測試aop。第一步 需要匯入對應的所需要的jar包 第二步 在beans.xml檔案中進行配置 命名標籤的配置 注意 要在配置中加入我注釋的那三行。第一次把第一行漏掉了,導致我在接下來的步驟中報錯,直接無法找到對應的命名標籤。第三步 即可對aop進行例項操作了。由於才開始學...