1. 程式人生 > >spring配置aop的總結

spring配置aop的總結

<aop:config proxy-target-class="true">
		<aop:pointcut id="leePointcut" expression="bean(personDAO)" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="leePointcut" />
	</aop:config>

應注意:proxy-target-class="true",當bean繼承了ActionSupport,這應加上這句;如果沒有,則去掉即可。

2、配置切入點的幾種方式

切入點可以在切面裡面宣告,這種情況下切入點只在切面內部可見。切入點也可以直接在<aop:config>下定義,這樣就可以使多個切面和通知器共享該切入點。

一個描述service層中表示所有service執行的切入點可以如下定義:

<aop:config>  <aop:pointcut id="businessService"expression="execution(* com.xyz.myapp.service.*.*(..))"/></aop:config>

注意切入點表示式本身使用了Section 6.2, “@AspectJ支援”中描述的AspectJ 切入點表示式語言。 如果你在Java 5環境下使用基於schema的宣告風格,可參考切入點表示式型別中定義的命名式切入點,不過這在JDK1.4及以下版本中是不被支援的(因為依賴於Java 5中的AspectJ反射API)。 所以在JDK 1.5中,上面的切入點的另外一種定義形式如下:

<aop:config>  <aop:pointcut id="businessService"expression="com.xyz.myapp.SystemArchitecture.businessService()"/></aop:config>

在切面裡面宣告一個切入點和宣告一個頂級的切入點非常類似:

<aop:config>  <aop:aspect id="myAspect" ref="aBean"><aop:pointcut id="businessService"  expression="execution(* com.xyz.myapp.service.*.*(..))"/>...  </aop:aspect></aop:config>

當需要連線子表示式的時候,'&'在XML中用起來非常不方便,所以關鍵字'and', 'or' 和 'not'可以分別用來代替'&', '||' 和 '!'。

注意這種方式定義的切入點通過XML id來查詢,並且不能定義切入點引數。在基於schema的定義風格中命名切入點支援較之@AspectJ風格受到了很多的限制。

<aop:pointcut id="leePointcut" expression="bean(personDAO)" />

注意:這種以bean配置的方式,bean()中的引用應該是一個介面型別。

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.*(..))