1. 程式人生 > >Spring 學習(十六)——Spring AOP之前置通知和後置通知

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 的引數. 然後就能訪問連結細節. 如方法名稱和引數值.

 

 

AspectJJava 社群裡最完整最流行的 AOP 框架.

Spring2.0 以上版本, 可以使用基於 AspectJ 註解或基於 XML 配置的 AOP

 

Spring 中啟用 AspectJ 註解支援

要在 Spring 應用中使用 AspectJ 註解, 必須在 classpath

下包含 AspectJ 類庫: aopalliance.jaraspectj.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 註解, 並將切入點表示式的值作為註解值.

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

標識這個方法是個前置通知切點表示式表示執行任意類的任意方法.

一個 * 代表匹配任意修飾符及任意返回值第二個 * 代表任意類的物件,

第三個 * 代表任意方法, 引數列表中的 ..  匹配任意數量的引數

後置通知是在連線點完成之後執行的, 即連線點返回結果或者丟擲異常的時候, 下面的後置通知記錄了方法的終止.

一個切面可以包括一個或者多個通知.

 

 

後置通知

後置通知是在連線點完成之後執行的, 即連線點返回結果或者丟擲異常的時候, 下面的後置通知記錄了方法的終止.

一個切面可以包括一個或者多個通知.