1. 程式人生 > >Spring的AOP動態代理

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型別. 舉例說明:

  1. 任意公共方法的執行: execution(public * *(..))
  2. 任何一個以“set”開始的方法的執行: execution(* set*(..))
  3. AccountService 介面的任意方法的執行:

execution(* com.xyz.service.AccountService.*(..))

  1. 定義在service包裡的任意方法的執行:

execution(* com.xyz.service..(..))

  1. 定義在service包和所有子包裡的任意類的任意方法的執行:

execution(* com.xyz.service...(..))

  1. 定義在pointcutexp包和所有子包裡的JoinPointObjP2類的任意方法的執行:

execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))

  1. pointcutexp包裡的任意類.

within(com.test.spring.aop.pointcutexp.*)

  1. pointcutexp包和所有子包裡的任意類.

within(com.test.spring.aop.pointcutexp..*)

  1. 實現了Intf介面的所有類,如果Intf不是介面,限定Intf單個類.

this(com.test.spring.aop.pointcutexp.Intf)

  1. 帶有@Transactional標註的所有類的任意方法.

@within(org.springframework.transaction.annotation.Transactional) @target(org.springframework.transaction.annotation.Transactional)

  1. 帶有@Transactional標註的任意方法.

@annotation(org.springframework.transaction.annotation.Transactional)

  1. 引數帶有@Transactional標註的方法. @args(org.springframework.transaction.annotation.Transactional)
  2. 引數為String型別(執行是決定)的方法. args(String)

2. SpringMVC如果要使用AOP註解,

<aop:aspectj-autoproxy proxy-target-class="true"/>