aop
aspect oriented programming
動態**
//為目標物件建立**物件
//方法執行器,幫我們目標物件執行目標方法
invocationhandler h = new invocationhandler()}
class<?> inte***ces = calculator.getclasss().getinte***ces();
classloader loader = calculator.getclass().getclassloader();
proxy.newproxyinstance(loader, inte***ces,h);
**物件和被**物件唯一的關聯:實現同乙個介面
動態**的缺點
1)複雜
2)jdk預設的動態**,如果目標物件沒有實現任何介面,無法建立**物件
基本概念:
切面類橫切關注點
通知方法
連線點切入點
切入點表示式
配置步驟
1)將目標類和切面類加入到容器
2) 告訴spring哪個是切面類@aspect
3)告訴spring切面類每個方法何時執行
4)開啟基於註解的aop功能 aop命名空間
aop:aspectj-autoproxy
通知註解
@before 前置通知 目標方法之前
@after 後置通知目標方法結束之後
@afterreturning 返回通知 目標方法正常返回之後
@afterthrowing 異常通知目標方法丟擲異常之後
@around 環繞通知
匹配任意型別引數
@afterreturning(value=「execution(public int com.impl.mymath*(int,*))」,returning=「result」)
匹配任意個引數
@before(「execution(int com.impl.mymath*(…))」)
匹配任意多層路徑
@afterthrowing(value=「execution(int com.impl…mymath*(…))」,throwing=「exception」)
獲取bean
有介面,ioc.getbean(「介面型別」)
沒有介面,ioc.getbean(「本型別」)
通知方法執行順序
正常:@before----@after-----@afterreturning
異常:@before——@after——@afterthrowing
在通知方法執行時,拿到目標方法的資訊
jointpoint jointpoint
jointpoint.getargs()
jointpoint.getsignature()
spring對通知方法的約束不嚴格,唯一要求是引數不能亂寫,每個引數必須是spring認識的
表示式重用
@pointcut(「execution(* *(…))」)
public void mypointcut(){};
環繞通知
@around
public object myaround(proceedingjointpoint pjp)catch(exception e) finally
}順序:環繞前置—普通前置—目標方法執行—環繞正常返回/異常—環繞後置—普通後置—普通正常返回/異常
@order(1) //改變切面順序
基於xml配置
aop:config
//全域性切入點表示式
(…)」 id=「globalpointcut」>
//內部切入點表示式
*(…)」 id=「mypointcut」>
Spring學習筆記 AOP
1 匯入aop模組 spring aop spring aspects 2 定義乙個業務邏輯 3 定義乙個日誌切面類 通知方法 前置通知 before 在目標方法執行之前執行 後置通知 after 在目標方法執行結束後執行 返回通知 afterrerurning 在目標方法正常返回之後執行 異常通知...
Spring學習筆記3 AOP
這一章是上周四晚上看的,一直沒空寫,所以今天補寫一下。spring aop,即面向切面設計。我覺得可以這樣理解這個概念,把幾個類並排放著,然後用一把 刀 橫向地切過。這幾個類共同有或者相似的幾個方法,就是切出來的。在oo的思想裡,如果類b中,有類a的一些方法,則可以讓b繼承a。但是繼承,就限制b一定...
Spring學習筆記三 註解AOP
1.匯入jar包 service public class studentservice component aspect public class studentadvice afterreturning value execution cn.wang.service.如果目標方法有返回值,後置增...