切入點@Pointcut的使用
在確定切面aspect之後,需要在切面上確定切入點pointcut
定義
註解@pointcut("{切入點}")
其中{切入點}格式如下:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
參數 | 說明 |
---|---|
modifiers-pattern | 修飾匹配 |
ret-type-pattern | 返回值匹配:可以爲*表示任何返回值,全路徑的類名等 |
declaring-type-pattern | 類路徑匹配 |
name-pattern | 方法名匹配:以指定方法名 或者 代表所有, set 代表以set開頭的所有方法 |
param-pattern | 參數匹配:可以指定具體的參數類型,多個參數間用“,”隔開,各個參數也可以用“”來表示匹配任意類型的參數,如(String)表示匹配一個String參數的方法;(,String) 表示匹配有兩個參數的方法,第一個參數可以是任意類型,而第二個參數是String類型;可以用(…)表示零個或多個任意參數 |
throws-pattern | 異常類型匹配 |
PS: 其中後面帶“?”的爲可選項;
一個切面aspect可以定義多個切入點pointcut,並支持運算符 || 、&& 、!
@Pointcut("execution(public * com.xhwl.seven.controller..*Controller.*(..))")
public void pointCut1(){}
@Pointcut("execution(public * com.xhwl.seven.controller..*Service.*(..))")
public void pointCut2(){}
@Pointcut("pointCut1() || pointCut2()")
public void pointCut3(){}
使用
定義完Pointcut之後,可在通知 advice 上定義使用
@Before("pointCut2()")
@AfterReturning(returning = "o", pointcut = "pointCut3()")
切入點的表達式
常用的表達式爲execution表達式,execution匹配的就是連接點(Joinpoint,一般是方法),看上面的表達式execution是固定的,方法的修飾符是可選的,返回類型是必須的,定義的全限類型也是可選的,名稱是必須的,參數是必須的,這些都可以使用通配符。
除了execution表達式,還有以下幾種:
- within:包名下所有方法
- this:指定類本身、繼承該類、實現該接口 等所有方法
- target:指定類本身、繼承該類、實現該接口 等所有方法
- annotation:任何使用指定註解的方法
如:
//指定包下所有方法
@Around("within(com.kellan.test..*)")
//所有使用了Transactional註解的方法
@Around("@annotation(org.springframework.transaction.annotation.Transactional)")
//指定TestService類本身、繼承該類、實現該接口 等所有方法;
@Around("this(com.aop.service.TestService)")
@Around("target(com.aop.service.TestService)")