在 Spring 中啓用 AspectJ 註解支持
- 要在 Spring 應用中使用 AspectJ 註解, 必須在 classpath 下包含 AspectJ 類庫: aopalliance.jar、aspectj.weaver.jar 和 spring-aspects.jar
- 將 aop Schema 添加到 <beans> 根元素中
- 要在 Spring IOC 容器中啓用 AspectJ 註解支持, 只要在 Bean 配置文件中定義一個空的 XML 元素 <aop:aspectj-autoproxy>
- 當 Spring IOC 容器偵測到 Bean 配置文件中的 <aop:aspectj-autoproxy> 元素時, 會自動爲與 AspectJ 切面匹配的 Bean 創建代理
用 AspectJ 註解聲明切面
- 要在 Spring 中聲明 AspectJ 切面, 只需要在 IOC 容器中將切面聲明爲 Bean 實例. 當在 Spring IOC 容器中初始化 AspectJ 切面之後, Spring IOC 容器就會爲那些與 AspectJ 切面相匹配的 Bean 創建代理.
- 在 AspectJ 註解中, 切面只是一個帶有 @Aspect 註解的 Java 類.
- 通知是標註有某種註解的簡單的 Java 方法.
- AspectJ 支持 5 種類型的通知註解:
- @Before: 前置通知, 在方法執行之前執行
- @After: 後置通知, 在方法執行之後執行
- @AfterRunning: 返回通知, 在方法返回結果之後執行
- @AfterThrowing: 異常通知, 在方法拋出異常之後
- @Around: 環繞通知, 圍繞着方法執行
前置通知
前置通知:在方法執行之前執行的通知
前置通知使用 @Before 註解, 並將切入點表達式的值作爲註解值.
前置通知使用 @Before 註解, 並將切入點表達式的值作爲註解值.
@Before 標識這個方法是個前置通知, 切點表達式表示執行 ArithmeticCalculator 接口的 add() 方法. * 代表匹配任意修飾符及任意返回值, 參數列表中 .. 表示匹配任意數量的參數
利用方法簽名編寫 AspectJ 切入點表達式
最典型的切入點表達式時根據方法的簽名來匹配各種方法:
- execution * com.atguigu.spring.ArithmeticCalculator.*(..): 匹配 ArithmeticCalculator 中聲明的所有方法,第一個 * 代表任意修飾符及任意返回值. 第二個 * 代表任意方法. .. 匹配任意數量的參數. 若目標類與接口與該切面在同一個包中, 可以省略包名.
- execution public * ArithmeticCalculator.*(..): 匹配 ArithmeticCalculator 接口的所有公有方法.
- execution public double ArithmeticCalculator.*(..): 匹配 ArithmeticCalculator 中返回 double 類型數值的方法
- execution public double ArithmeticCalculator.*(double, ..): 匹配第一個參數爲 double 類型的方法, .. 匹配任意數量任意類型的參數
- execution public double ArithmeticCalculator.*(double, double): 匹配參數類型爲 double, double 類型的方法.
合併切入點表達式
在 AspectJ 中, 切入點表達式可以通過操作符 &&, ||, ! 結合起來
讓通知訪問當前連接點的細節
可以在通知方法中聲明一個類型爲 JoinPoint 的參數. 然後就能訪問鏈接細節. 如方法名稱和參數值.
後置通知
後置通知是在連接點完成之後執行的, 即連接點返回結果或者拋出異常的時候, 下面的後置通知記錄了方法的終止
一個切面可以包括一個或者多個通知
一個切面可以包括一個或者多個通知