Spring事務管理—aop:pointcut expression解析

xz43發表於2015-11-05

學習AOP,關鍵在於理解AOP的思想,能夠使用AOP。對於AOP眾多的概念,需要理解3個重要的概念是Pointcut、Advice和Advisor。

切入點(Pointcut)

  在介紹Pointcut前,有必要先介紹一下Join Point(連線點)的概念。Join Point指的是程式執行中的某個階段點,如某個方法呼叫、異常丟擲等。Pointcut是Join Point的集合,它是程式中需要注入Advice的位置的集合,指明Advice要在什麼樣的條件下才能被觸發。

org.springframework.aop.Pointcut 介面用來指定通知到特定的類和方法,在介面Pointcut中,主要包含兩個介面:ClassFilter和MethodMatcher

說明:

  介面ClassFilter,用來將切入點限定在給定的目標類中。

  介面MethodMatcher,用來判斷切入點是否匹配目標類給定的方法。

通知(Advice)

Advice是某個連線點所採用的處理邏輯,也就是向連線點注入的程式碼。

Advisor

Advisor是Pointcut和Advice的配置器,它包括Pointcut和Advice,是將Advice注入程式中Pointcut位置的程式碼。

上面只是粗略地對AOP的3個概念進行一下說明,目的是讓讀者能夠較快地進入到AOP中。


先來看看這個spring的配置檔案的配置:


點選(此處)摺疊或開啟

  1. <!-- 事務管理器 -->
  2.  <bean id="transactionManager"
  3.   class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  4.   <property name="sessionFactory" ref="sessionFactory" />
  5.  </bean>

  6.  <!-- 配置事務的傳播特性 -->
  7.  <tx:advice id="txAdvice" transaction-manager="transactionManager">
  8.   <tx:attributes>
  9.    <tx:method name="get*" propagation="REQUIRED" read-only="true" />
  10.    <tx:method name="del*" propagation="REQUIRED" />
  11.    <tx:method name="save*" propagation="REQUIRED" />
  12.    <tx:method name="update*" propagation="REQUIRED" />
  13.   </tx:attributes>
  14.  </tx:advice>

  15.  <!-- 配置事務攔截器攔截哪些類的哪些方法,一般設定成攔截Service -->
  16.  <aop:config>
  17.   <aop:pointcut expression="execution(* com.buty.service.*.*(..))"
  18.    id="allDaoMethod" />
  19.   <aop:advisor advice-ref="txAdvice" pointcut-ref="allDaoMethod" />
  20.  </aop:config>

表示com.buty.service包下的所有方法為為事務管理。


execution(* com.buty.shtel.account.dao.impl.*.*(..)) 


這樣寫就可以了,這是com.buty.shtel.account.dao.impl 包下所有類的所有方法。

第一個 * 代表所有的返回值型別;

第二個 * 代表所有的類;

第三個 * 代表類所有方法,最後一個 .. 代表方法的所有引數。


下面給出一些常見切入點表示式的例子:

  • 任意公共方法的執行:

    execution(public * *(..))
    
  • 任何一個以“set”開始的方法的執行:

    execution(* set*(..))
    
  • AccountService 介面的任意方法的執行:

    execution(* com.xyz.service.AccountService.*(..))
    
  • 定義在service包裡的任意方法的執行:

    execution(* com.xyz.service.*.*(..))
    
  • 定義在service包或者子包裡的任意類的任意方法的執行:

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-1823332/,如需轉載,請註明出處,否則將追究法律責任。

相關文章