1. 程式人生 > >8、AOP切入點詳解

8、AOP切入點詳解

@AspectJ支援

如果使用@Configuration註解配置Spring,需要新增@EnableAspectJAutoProxy

@Configuration
@EnableAspectJAutoProxy
public class ApplicationConfig {

}

如果使用XML需要在XML中新增

<aop:aspectj-autoproxy />

宣告一個切面

首先需要在類中新增@Aspect註解,注意是@Aspect而不是@AspectJ。然後將這個類加入到Spring容器中就可以了。上一章的例子中有講到。
這裡使用註解或者XML配置都可以。

宣告一個切入點

使用@Pointcut註解宣告一個切入點。
語法:@Pointcut(the pointcut expression)
@Pointcut支援下列Pointcut識別符號。
- execution - 這個是Spring中最主要的Pointcut標誌符,用於指定要匹配的方法。
- within - 限定切入點所在的類。@Pointcut("within(package.class)")
- this - 用於匹配當前AOP代理物件型別的執行方法;注意是AOP代理物件的型別匹配,這樣就可能包括引入介面也型別匹配。方法是在那個類中被呼叫的。
- target - 用於匹配當前目標物件型別的執行方法;注意是目標物件的型別匹配,這樣就不包括引入介面也型別匹配;指明攔截的方法屬於那個類。
- args

- 限定切入點方法的引數。
- bean - 匹配Bean
- @target - 用於匹配當前目標物件型別的執行方法,其中目標物件持有指定的註解;必須是在目標物件上宣告這個註解,在介面上宣告的對它不起作用
- @args - 用於匹配當前執行的方法傳入的引數持有指定註解的執行;
- @within - 用於匹配所有持有指定註解型別的方法;必須是在目標物件上宣告這個註解,在介面上宣告的對它不起作用
- @annotation - 用於匹配當前執行方法持有指定註解的方法;

execution表示式

語法:execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)
throws-pattern?)

modifiers-pattern:方法的型別,public,private...
ret-type-pattern:返回值型別,*表示所有,void表示沒有返回值…
declaring-type-pattern:型別匹配
name-pattern:方法名匹配,*表示所有,set\*表示所有以set開頭的方法
param-pattern:表示引數型別,..表示所有都匹配,*匹配有一個引數的方法,**匹配有兩個引數的方法。

//所有public方法
execution(public * *(..))

//所有以set開頭的方法
execution(* set*(..))

//com.xyz.service.AccountService中的所有方法
execution(* com.xyz.service.AccountService.*(..)) 

//com.xyz.service包下的所有類的所有方法
execution(* com.xyz.service.*.*(..))

//com.xyz.service包及其子包下的所有類的所有方法
execution(* com.xyz.service..*.*(..))

其他表示式

//com.xyz.service下所有類的所有方法
within(com.xyz.service.*)

//com.xyz.service及其子包下所有類的所有方法
within(com.xyz.service..*)

//所有實現了AccountService介面的代理物件
this(com.xyz.service.AccountService)

//所有實現了AccountService介面的目標物件
target(com.xyz.service.AccountService)

//所有蠶食是Serializable型別的方法。
args(java.io.Serializable)

註解切入點的寫法

//目標物件有@Transactional註解,是在類上註解而不是方法,不支援介面
@target(org.springframework.transaction.annotation.Transactional)

//目標物件有@Transactional註解,是在類上註解而不是方法,支援介面
@within(org.springframework.transaction.annotation.Transactional)

//有@Transactional註解的所有方法
@annotation(org.springframework.transaction.annotation.Transactional)

//只有一個引數且引數上聲明瞭Classified註解
@args(com.xyz.security.Classified)

邏輯運算子支援

&& ,||, !分別表示與、或、非

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