使用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