Spring學習筆記之前置通知&後置通知

在 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 標識這個方法是個前置通知,  切點表達式表示執行 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 的參數. 然後就能訪問鏈接細節. 如方法名稱和參數值.

後置通知

後置通知是在連接點完成之後執行的, 即連接點返回結果或者拋出異常的時候, 下面的後置通知記錄了方法的終止 
一個切面可以包括一個或者多個通知


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章