Spring AOP中pointcut expression表達式解析 及匹配多個條件


 

Pointcut 是指那些方法需要被執行"AOP",是由"Pointcut Expression"來描述的.

Pointcut可以有下列方式來定義或者通過&& || 和!的方式進行組合.

args()

@args()

execution()

this()

target()

@target()

within()

@within()

@annotation

其中 execution 是用的最多的,其格式為:

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

returning type pattern,name pattern, and parameters pattern是必須的.

ret-type-pattern:可以為*表示任何返回值,全路徑的類名等.

name-pattern:指定方法名,*代表所以,set*,代表以set開頭的所有方法.

parameters pattern:指定方法參數(聲明的類型),(..)代表所有參數,(*)代表一個參數,(*,String)代表第一個參數為任何值,第二個為String類型.

舉例說明:

任意公共方法的執行:

execution(public * *(..))

任何一個以“set”開始的方法的執行:

execution(* set*(..))

AccountService 接口的任意方法的執行:

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

定義在service包里的任意方法的執行:

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

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

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

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

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

***> 最靠近(..)的為方法名,靠近.*(..))的為類名或者接口名,如上例的JoinPointObjP2.*(..))

 

<aop:config>

  <aop:pointcut expression="execution(* com.travelsky.ccboy.dao..*.find*(..)) ||  

execution(* com.travelsky.ccboy.dao..*.query*(..))"

   id="findCachePointcut" />

  <aop:advisor advice-ref="jdbcInterceptor" pointcut-ref="findCachePointcut" />

</aop:config>

 

在多個表達式之間使用  || , or 表示  或 ,使用  && , and 表示  與 , ! 表示 

.

 

 

 

 

 

上面的代碼也可以改寫成

<aop:config>

  <aop:pointcut expression=" ( execution(* com.travelsky.ccboy.dao..*.find*(..)))  or(execution(* com.travelsky.ccboy.dao..*.query*(..))

)

"

 

   id="findCachePointcut" />

  <aop:advisor advice-ref="jdbcInterceptor" pointcut-ref="findCachePointcut" />

 

</aop:config>

 

 

 

注意上面兩中方法的不同點出了 將 || 改成了 or ,還有就是 每個execution都被 ()包含起來,建議為了區分不同的表達式 最好都是用()包裝。

pointcutexp包里的任意類.

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

pointcutexp包和所有子包里的任意類.

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

實現了Intf接口的所有類,如果Intf不是接口,限定Intf單個類.

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

***> 當一個實現了接口的類被AOP的時候,用getBean方法必須cast為接口類型,不能為該類的類型.

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

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

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

帶有@Transactional標注的任意方法.

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

***> @within和@target針對類的注解,@annotation是針對方法的注解

參數帶有@Transactional標注的方法.

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

參數為String類型(運行是決定)的方法.

args(String)

Pointcut 可以通過Java注解和XML兩種方式配置,如下所示:

<bean id="bravemandao" class="com.test.dao.BraveManDao">   <property name="barveman" ref="braveman"></property>  </bean>  <bean id="braveman" class="com.test.bean.BraveMan">    </bean>  <bean id="minstrel" class="com.test.bean.Minstrel"></bean>  <aop:config>   <aop:aspect ref="minstrel">    <aop:pointcut expression="execution(* *.test(..))" id="say"/>    <aop:before pointcut-ref="say" method="singBeforeSay"/>    <aop:after pointcut-ref="say" method="singAfterSay"/>   </aop:aspect>  </aop:config>
package com.test.bean;

public class Minstrel {  public void singBeforeSay(){   System.out.println("before say!!!");  }  public void singAfterSay(){   System.out.println("after say!!!");  } }
public class BraveManDao {  BraveMan braveman;  public BraveMan getBarveman() {   return braveman;  }  public void setBarveman(BraveMan braveman) {   this.braveman = braveman;  }  public void test(){   braveman.say();  } }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM