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*(..))