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提供的文檔在這方面也沒有提供更詳細的解釋,所以這里將不再對動態切入點和自定義切入點進行更加詳細的介紹。