spring之AOP操作(基於aspectJ實現)--配置檔案和註解兩種方式實現
AOP概念
1 aop:面向切面(方面)程式設計,擴充套件功能不修改原始碼實現
2 AOP採取橫向抽取機制,取代了傳統縱向繼承體系重複性程式碼
3 aop底層使用動態代理實現
(1)第一種情況,有介面情況,使用動態代理建立介面實現類代理物件
(2)第二種情況,沒有介面情況,使用動態代理建立類的子類代理物件
AOP原理
畫圖分析原理
原始實現(基於縱向抽取):
aop實現(橫向抽取):
AOP操作術語
Joinpoint(連線點): 類裡面可以被增強的方法,這些方法稱為連線點
Pointcut(切入點):所謂切入點是指我們要對哪些Joinpoint進行攔截的定義.
Advice(通知/增強):所謂通知是指攔截到Joinpoint之後所要做的事情就是通知.通知分為前置通知,後置通知,異常通知,最終通知,環繞通知(切面要完成的功能)
Aspect(切面): 是切入點和通知(引介)的結合
Introduction(引介):引介是一種特殊的通知在不修改類程式碼的前提下, Introduction可以在執行期為類動態地新增一些方法或Field.
Target(目標物件):代理的目標物件(要增強的類)
Weaving(織入):是把增強應用到目標的過程.
把advice 應用到 target的過程
Proxy(代理):一個類被AOP織入增強後,就產生一個結果代理類
Spring的aop操作
1 在spring裡面進行aop操作,使用aspectj實現
(1)aspectj不是spring一部分,和spring一起使用進行aop操作
(2)Spring2.0以後新增了對AspectJ支援
2 使用aspectj實現aop有兩種方式
(1)基於aspectj的xml配置
(2)基於aspectj的註解方式
Aop操作準備
1 除了匯入基本的jar包之外,還需要匯入aop相關的jar包
2 建立spring核心配置檔案,匯入aop的約束
使用表示式配置切入點
1 切入點:實際增強的方法
2 常用的表示式
execution(<訪問修飾符>?<返回型別><方法名>(<引數>)<異常>)
(1)execution(* cn.itcast.aop.Book.add(..))
(2)execution(* cn.itcast.aop.Book.*(..))
(3)execution(* *.*(..))
(4) 匹配所有save開頭的方法 execution(* save*(..))
Aspectj的aop操作(使用配置檔案實現)
<!-- 1 配置物件 --> <bean id="book" class="cn.itcast.aop.Book"></bean> <bean id="myBook" class="cn.itcast.aop.MyBook"></bean> <!-- 2 配置aop操作 --> <aop:config> <!-- 2.1 配置切入點 --> <aop:pointcut expression="execution(* cn.itcast.aop.Book.*(..))" id="pointcut1"/> <!-- 2.2 配置切面 把增強用到方法上面 --> <aop:aspect ref="myBook"> <!-- 配置增強型別 method: 增強類裡面使用哪個方法作為前置 --> <aop:before method="before1" pointcut-ref="pointcut1"/> <aop:after-returning method="after1" pointcut-ref="pointcut1"/> <aop:around method="around1" pointcut-ref="pointcut1"/> </aop:aspect> </aop:config>
public class MyBook { public void before1() { System.out.println("前置增強......"); } public void after1() { System.out.println("後置增強......"); } //環繞通知 public void around1(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { //方法之前 System.out.println("方法之前....."); //執行被增強的方法 proceedingJoinPoint.proceed(); //方法之後 System.out.println("方法之後....."); } }