天天看點

【spring架構】AOP的Annotation實作(上)

使用annotation來實作aop的動态代理:

@aspectj支援

@aspectj使用了java 5的注解,可以将切面聲明為普通的java類。@aspectj樣式在aspectj 5釋出的aspectj project部分中被引入。spring 2.0使用了和aspectj 5一樣的注解,并使用aspectj來做切入點解析和比對。但是,aop在運作時仍舊是純的spring aop,并不依賴于aspectj的編譯器或者織入器(weaver)。 

使用aspectj的編譯器或者織入器的話就可以使用完整的aspectj語言,我們将在第 6.8 節 “在spring應用中使用aspectj”中讨論這個問題。

6.2.1. 啟用@aspectj支援

為了在spring配置中使用@aspectj切面,你首先必須啟用spring對@aspectj切面配置的支援,并確定自動代理(autoproxying)的bean是否能被這些切面通知。自動代理是指spring會判斷一個bean是否使用了一個或多個切面通知,并據此自動生成相應的代理以攔截其方法調用,并且確定通知在需要時執行。 

通過在你的spring的配置中引入下列元素來啟用spring對@aspectj的支援:

<aop:aspectj-autoproxy/>

需要的jar包:aspectjrt.jar、aspectjweaver.jar

需要加新的命名空間:

beans.xml:

實驗:

需要加在前面的代理類loginterceptor:

測試:

結果:

method start

add success!!

原理:

首先spring會通過

去按照注解@component注解去找相應的bean,在找loginterceptor的時候,它發現這個類還是一個@aspect,也就是說這個是個切面邏輯,可以把它切到其它的方法上面去,那麼它怎麼往裡切呢?他發現了你用@before定義了一下,在這個execution指定的方法執行之前(execution方法、屬性、類)去執行下面定義的方法。

execution可以指定在任何方法上,userdaoimpl自己的業務邏輯不會受任何影響,它甚至不知道有新的邏輯切入進來了,這就保證了userdaoimpl業務邏輯的純潔性。

下面介紹一些專業術語:

關于spring的aop的一些專業術語:

1.joinpoint:

連接配接點、切入點

就是說在哪些點上把切面邏輯加進去(比如在save方法之前)

2.pointcut:

切入點的集合

我們可以一下定好多切入點

例如:在com.xyz.someapp.service任何類的任何方法切入

@pointcut("execution(* com.xyz.someapp.service.*.*(...))")

public voidbussinessservice(){}

3.aspect(切面):

前面我們寫的loginterceptor切面類裡面有好多方法加到不同的被代理的對

象上面去,這就是那個切面。也就是加@aspect注解的類。

4.advice:

在加入的那個點上的"建議",與aspect意思有些重合。

可以這樣了解,aspect是個"面",而advice是那個"面"的邏輯

就是在你要代理的方法上加"@before或@after等邏輯"

5.target:

被代理對象

把我們的業務邏輯"織入"到哪個對象上面去

6.weave:

織入。

和織布機一樣,橫排的織完,豎排的再去織,這時候就像業務邏輯切進去一樣,被織入進去了。

轉載請注明出處:http://blog.csdn.net/acmman/article/details/44344193