aop面向切面程式設計
指在程式執行期間,將某段**動態的切入到指方法的指定位置進行執行的這種程式設計方式,即面向切面程式設計。
使用動態**和反射
jdk預設的動態**,如果目標物件沒有實現任何介面,是無法為他建立**物件的。
結構圖寫配置1)將目標類和切面類加入到ioc容器中
@service @component
2)還應該告訴spring到底哪個是切面類@aspect
@before在目標方法之間執行 前置通知
@after在目標方法結束之後 後置通知
@afterreturning在目標方法正常返回之後 返回通知
@afterthrowing在目標方法丟擲異常之後 異常通知
@around:環繞 環繞通知
execution
returning 告訴spring那個用來接收返回值
throwing 告訴spring哪個用來接收異常
@before
("execution(訪問許可權符 返回值 方法全類名(引數))"
)
@before
(value=
"execution(訪問許可權符 返回值 方法全類名(引數))",returning=
"")
3)開啟基於註解的aop給功能
<
aop:aspectj-autoproxy
>
aop:aspectj-autoproxy
>
cglib為沒有介面的元件也可以建立**物件
切入點表示式
1)匹配乙個或多個字元
2)匹配任意乙個引數
3)只能匹配一層路徑
4)許可權位置*不能 許可權位置不寫就行 public【可選的】
1)匹配任意多個引數,和任意型別引數
2)匹配任意多層路徑
joinpoint
public static void xx(joinpoint joinpoint)
joinpoint :封裝了當前目標方法的詳細資訊
getargs 獲取到目標方法執行時使用的引數
getsignature 獲取到方法簽名
spring對通知方法的要求不嚴格
唯一要求的 就是方法的引數列表一定不能亂寫,參數列上的每乙個引數,spring都得知道是什麼
抽取可重用的切點表示式
1.宣告乙個沒有實現的返回void的空方法
2.給方法上標註@pointcut註解
@pointcut
("execution()"
)public
void
test()
;
3.對應註解使用方法名即可
@before
("test"
)
環繞通知
是spring中最強大的通知。
四合一通知就是環繞通知
@around
("test"
)public object myaround (proceedingjoinpoint pjp) thorws throwable
catch
(e)finally
return proceed;
}
環繞通知:是優先於普通通知執行
環繞前置–普通前置–目標方法執行–環繞正常返回/出現異常–環繞後置–普通後置
多切面執行順序
1)@order(1)//使用order改變切面順序 數值越小優先順序越高
2)按照字典序
aop使用場景
1)日誌
2)做許可權驗證
3)安全檢查
4)事務控制
基於註解的aop
1.將目標類和切面類都加入到ioc容器中
2.告訴spring哪個是切面類
3.在切面類中使用五個通知註解來配置切面中的這些通知方法都何時何地執行
4.開啟基於註解的aop功能
""class="
">
bean
>
<
aop:config
>
<
aop:aspect
ref=""
>
<
aop:before
method="
" pointcut="
">
aop:before
>
aop:aspect
>
aop:config
>