Spring框架 AOP細節

2021-07-24 21:27:23 字數 3492 閱讀 6464

知己海記憶體

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進行例項操作了。由於才開始學...