Spring AOP中切入點@Pointcut的使用

切入點@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)")
發佈了48 篇原創文章 · 獲贊 25 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章