Aop筆記。
Spring程序中實現AOP
- Spring程序實現aop的方式
1) 使用Spring的API實現AOP,將方面切入Spring管理的bean
2) 使用AspectJ的API實現AOP,將方面切入到任何對象
- 使用@AspectJ的各種註解
- 使用aop:config元素配置AOP,基於xml進行配置aop, 基於Schema的AOP支持
Spring 框架實現aop使用動態代理的方式實現AOP
設計模式:
單例模型, 工廠模式, 代理(Proxy)模式(Pattern)
代理模式:
- 靜態代理 static proxying
- 動態代理 dynamic proxying
- AOP的一些概念/術語
1) 切面/方面(Aspect):一個關註點的模塊化,這個關註點可能會橫切多個對象。可創建方面類,用於包含次要業務邏輯。
2) 通知(Advice):在切面的某個特定的連接點上執行的動作,也就是方面包含/要執行的操作。通知有5中類型:
- 前置通知(Before advice): 在某連接點之前執行的通知
- 返回後通知(After returning advice): 在某連接點正常完成後執行的通知:例如,一個方法沒有拋出任何異常,正常返回。
- 異常後通知(After throwing advice): 在方法拋出異常退出時執行的通知。
- 最終通知(After (finally) advice):
- 環繞通知(Around Advice): 最強大的通知,可替換上面任何一個通知, 環繞通知在一個方法執行之前和之後執行。它使得通知有機會 在一個方法執行之前和執行之後運行。而且它可以決定這個方法在什麽時候執行,如何執行,甚至是否執行. 盡量使用最簡單的通知,比如如果你需要一個前置通知,則使用前置通知即可.在環繞通知中,你可以決定是否執行目標方法. 類似一個攔截器.
通知執行順序: 前置通知
3) 連接點(Joinpoint): 在程序執行過程中某個特定的點,比如某方法調用的時候或者處理異常的時候。在Spring AOP中,一個連接點總是表示一個方法的執行
4) 切入點(Pointcut): 選定要切入方面或通知的連接點叫做切入點,也就是指定要切入通知或方法的方法。
切入點書寫模式
execution(modifiers-pattern? return-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
訪問定界符: public, private, protected, default(不寫就是default)
execution(訪問定界符 方法返回類型 包.類.方法 (參數) 可拋出異常類型)
例如: execution(* com.qdu.dao.*. *(..) )
上例表示com.qdu.dao包下所有類中的所有方法,不管有多個參數,第一個*表示方法返回類型為任何類型
execution關鍵字 - 匹配方法執行的連接點,這是你會用到的Spring的最主要的切入點指示符。
切入點示例:
? 任意公共方法的執行:
execution(public * *(..))
? 任何一個名字以“set”開始的方法的執行:
execution(* set*(..))
? AccountService接口定義的任意方法的執行:
execution(* com.xyz.service.AccountService.*(..))
? 在service包中定義的任意方法的執行:
execution(* com.xyz.service.*.*(..))
? 在service包或其子包中定義的任意方法的執行:
execution(* com.xyz.service..*.*(..))
5) 目標(Target): 是方面應用到的對象,如 UserDaoImpl的對象
6) 織入(Weaving): 將方面應用到目標對象的過程叫做織入 weave
Aop筆記。