Spring的AOP動態代理
6. AOP動態代理
AOP(Aspect Oriented Programming),即面向切面程式設計(也叫面向方面程式設計,面向方法程式設計)。其主要作用是,在不修改原始碼的情況下給某個或者一組操作新增額外的功能。像日誌記錄,事務處理,許可權控制等功能,都可以用AOP來“優雅”地實現,使這些額外功能和真正的業務邏輯分離開來,軟體的結構將更加清晰。AOP是OOP的一個強有力的補充。
1. 註解
- @Before – 目標方法執行前執行
- @After – 目標方法執行後執行
- @AfterReturning – 目標方法返回後執行,如果發生異常不執行
- @AfterThrowing – 異常時執行
- @Around – 在執行上面其他操作的同時也執行這個方法
Pointcut expression
Pointcut可以有下列方式來定義或者通過&& || 和!的方式進行組合.
- args()
- @args()
- execution()
- this()
- target()
- @target()
- within()
- @within()
- @annotation 其中execution 是用的最多的,其格式為:
ret-type-pattern,name pattern, 和 parameters pattern是必須的.
ret-type-pattern:可以為表示任何返回值,全路徑的類名等. name-pattern:指定方法名,代表所以,set,代表以set開頭的所有方法. parameters pattern:指定方法引數(宣告的型別),(..)代表所有引數,()代表一個引數,(*,String)代表第一個引數為任何值,第二個為String型別. 舉例說明:
- 任意公共方法的執行: execution(public * *(..))
- 任何一個以“set”開始的方法的執行: execution(* set*(..))
- AccountService 介面的任意方法的執行:
execution(* com.xyz.service.AccountService.*(..))
- 定義在service包裡的任意方法的執行:
execution(* com.xyz.service..(..))
- 定義在service包和所有子包裡的任意類的任意方法的執行:
execution(* com.xyz.service...(..))
- 定義在pointcutexp包和所有子包裡的JoinPointObjP2類的任意方法的執行:
execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))
- pointcutexp包裡的任意類.
within(com.test.spring.aop.pointcutexp.*)
- pointcutexp包和所有子包裡的任意類.
within(com.test.spring.aop.pointcutexp..*)
- 實現了Intf介面的所有類,如果Intf不是介面,限定Intf單個類.
this(com.test.spring.aop.pointcutexp.Intf)
- 帶有@Transactional標註的所有類的任意方法.
@within(org.springframework.transaction.annotation.Transactional) @target(org.springframework.transaction.annotation.Transactional)
- 帶有@Transactional標註的任意方法.
@annotation(org.springframework.transaction.annotation.Transactional)
- 引數帶有@Transactional標註的方法. @args(org.springframework.transaction.annotation.Transactional)
- 引數為String型別(執行是決定)的方法. args(String)
2. SpringMVC如果要使用AOP註解,
<aop:aspectj-autoproxy proxy-target-class="true"/>