Spring 學習(十六)——Spring AOP之前置通知和後置通知
spring aop
1)加入jar包
com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar spring-aop-4.0.0.RELEASE.jar spring-aspects-4.0.0.RELEASE.jar commons-logging-1.1.1.jar spring-beans-4.0.0.RELEASE.jar spring-context-4.0.0.RELEASE.jar spring-core-4.0.0.RELEASE.jar spring-expression-4.0.0.RELEASE.jar
2)在配置檔案中加入aop的名稱空間
3)基於註解的方式
1.在配置檔案中加入如下配置
<aop:aspectj-autoproxy/>
2.把橫切關注點的程式碼抽象到切面的類中
i:切面首先是一個 ioc 容器中的 bean ,即加入 @ component註解
ii:切面還需要加入 @aspect註解
3.在類中宣告各種通知
i:宣告一個方法
ii:在方法前加入 @before註解
4.•可以在通知方法中宣告一個型別為 JoinPoint 的引數. 然後就能訪問連結細節. 如方法名稱和引數值.
•AspectJ:Java 社群裡最完整最流行的 AOP 框架.
•在 Spring2.0 以上版本中, 可以使用基於 AspectJ 註解或基於 XML 配置的 AOP
在 Spring 中啟用 AspectJ 註解支援
•要在 Spring 應用中使用 AspectJ 註解, 必須在 classpath
•將 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 註解, 並將切入點表示式的值作為註解值.
•
標識這個方法是個前置通知, 切點表示式表示執行 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 的引數. 然後就能訪問連結細節. 如方法名稱和引數值.
標識這個方法是個前置通知, 切點表示式表示執行任意類的任意方法. 第
一個 * 代表匹配任意修飾符及任意返回值, 第二個 * 代表任意類的物件,
第三個 * 代表任意方法, 引數列表中的 .. 匹配任意數量的引數
•後置通知是在連線點完成之後執行的, 即連線點返回結果或者丟擲異常的時候, 下面的後置通知記錄了方法的終止.
•一個切面可以包括一個或者多個通知.
後置通知
•後置通知是在連線點完成之後執行的, 即連線點返回結果或者丟擲異常的時候, 下面的後置通知記錄了方法的終止.
•一個切面可以包括一個或者多個通知.