spring aop方式配置事務中的三個概念 pointcut advice advisor


AOP的3個關鍵概念

  因為AOP的概念難於理解,所以在前面首先對Java動態代理機制進行了一下講解,從而使讀者能夠循序漸進地來理解AOP的思想。

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

1  切入點(Pointcut)

  在介紹Pointcut前,有必要先介紹一下Join Point(連接點)的概念。Join Point指的是程序運行中的某個階段點,如某個方法調用、異常拋出等。前面示例中的doAuditing()方法就是一個Join Point,表示程序是要在這個地方加入Advice。

Pointcut是Join Point的集合,它是程序中需要注入Advice的位置的集合,指明Advice要在什么樣的條件下才能被觸發。

org.springframework.aop.Pointcut 接口用來指定通知到特定的類和方法。查看Spring下載包里的源文件Pointcut.java,路徑是spring-framework-2.0-

m1/src/org/springframework/aop,可以看到Pointcut.java.源代碼如下:

1
2
3
4
5
6
7
8
9
//******* Pointcut.java**************
package  org.springframework.aop;
public  interface  Pointcut {
          //用來將切入點限定在給定的目標類中
          ClassFilter getClassFilter();
          //用來判斷切入點是否匹配目標類給定的方法
          MethodMatcher getMethodMatcher();
          Pointcut TRUE = TruePointcut.INSTANCE;
}

 

代碼說明:

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

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

從上面可以看出,在接口Pointcut中,主要包含兩個接口:ClassFilter和MethodMatcher,有利於代碼的重用。

 

2  通知(Advice)

Advice是某個連接點所采用的處理邏輯,也就是向連接點注入的代碼。前面示例中提取出來輸出日志信息的代碼就是一個Advice,表示要在Join Point加入這

段代碼。

3  Advisor

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

上面只是粗略地對AOP的3個概念進行一下說明,目的是讓讀者能夠較快地進入到AOP中,接下來將會分別對這3個概念進行更加詳細的講解。

 

Spring的3種切入點(Pointcut)實現

Pointcut是Join Point的集合,它是程序中需要注入Advice的位置的集合。Spring主要提供了3種切入點(Pointcut)的實現:靜態切入點、動態切入點和自定義切入點,下面分別進行講解。

1  靜態切入點

  靜態切入點只限於給定的方法和目標類,而不考慮方法的參數。Spring在調用靜態切入點時只在第一次的時候計算靜態切入點的位置,然后把它緩存起來,

后就不需要再進行計算。使用org.springframework.aop.support.RegexpMethodPointcut 可以實現靜態切入點,RegexpMethodPointcut是一個通用的正則表達

式切入點,它是通過Jakarta ORO來實現的,需要把jakarta-oro-2.0.8.jar加入到ClassPath中,它的正則表達式語法和Jakarta ORO的正則表達式語法是一樣

的。使用RegexpMethodPointcut的一個示例代碼如下:

<bean id="settersAndAbsquatulatePointcut"

   class="org.springframework.aop.support.RegexpMethodPointcut">

   <property name="patterns">

       <!--設定切入點-->

<list>

           <value>.*save.*</value>

           <value>.*do.* </value>

       </list>

   </property>

</bean>

代碼說明:

.*save.*,表示所有以save開頭的方法都是切入點。

 .* do.*,表示所有以do開頭的方法都是切入點。

2  動態切入點

   動態切入點與靜態切入點的區別是,它不僅限定於給點的方法和類,動態切入點還可以指定方法的參數。因為參數的變化性,所以動態切入點不能緩存,需要每次調用的時候都進行計算,因此使用動態切入點有很大的性能損耗。當切入點需要在執行時根據參數值來調用通知時,就需要使用動態切入點。Spring提供了一個內建的動態切入點:控制流切入點。此切入點匹配基於當前線程的調用堆棧。開發人員只有在當前線程執行時找到特定的類和特定的方法才返回true。其實大多數的切入點可以使用靜態切入點,所以很少有機會創建動態切入點。

3  自定義切入點

   因為Spring中的切入點是Java類,而不是語言特性(如AspectJ),因此可以定義自定義切入點。因為AOP還沒有完全成熟,Spring提供的文檔在這方面也沒有提供更詳細的解釋,所以這里將不再對動態切入點和自定義切入點進行更加詳細的介紹。


免責聲明!

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



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