Spring技術(shù)手冊筆記(二):Spring AOP
Posted on 2009-11-08 20:12 codingliyi 閱讀(601) 評論(0) 編輯 收藏 所屬分類: Java EE四、SpringAOP
學(xué)習(xí)AOP必須首先要學(xué)習(xí)代理模式。詳見我的上一篇筆記:AOP基礎(chǔ):動態(tài)代理
AOP觀念與術(shù)語
1.橫切關(guān)注點(Cross-cutting concern)
類似于日志記錄、安全檢查、事務(wù)等系統(tǒng)層面的服務(wù),在一些應(yīng)用程序中常被尖刀安插至各個對象的處理流程中,這些動作在AOP術(shù)語中被稱為橫切關(guān)注點。
2.切面(Aspect)
將散落于各個業(yè)務(wù)對象中的橫切關(guān)注點(如日志記錄)收集起來,設(shè)計各個獨立可重用的對象,這些對象被稱為切面。如上篇筆記中的Handler類。在需要該服務(wù)時,織入(Weave)應(yīng)用程序之上。
3.Advice
Aspect的具體實現(xiàn)被稱之為Advice。例如,Advice中會包括日志記錄程序代碼是如何實現(xiàn)的。Advice中包含了橫切關(guān)注點的行為或提供的服務(wù)。
4.Joinpoint
Aspect在應(yīng)用程序執(zhí)行時加入業(yè)務(wù)流程的點或時機。這個時機可能是某個方法執(zhí)行之前或之后或兩者都有,或是某個異常發(fā)生的時候。
5.Pointcut
Pointcut是一個定義,可在某個定義文件中編寫Pointcut,指定某個Aspect在哪些Joinpoint時被織入。
Spring AOP
Spring的Advice是在執(zhí)行時期導(dǎo)入至Targets的,可以讓Target實現(xiàn)預(yù)先定義的接口,則Spring在執(zhí)行時會使用動態(tài)代理;如不實現(xiàn)接口,則會使用CGLIB為Target產(chǎn)生一個子類作為代理類。
Spring只支持方法的Joinpoints,即Advices將在方法執(zhí)行的前后調(diào)用。
Advices
Advices包括Aspect的真正邏輯,具體說來就是一個類,由于織入至Targets的時機不同,Spring提供了幾種不同的Advices,如BeforeAdvice、AfterAdvice、ArountAdvice、ThrowAdvice。
BeforeAdvice
通過實現(xiàn)org.springframework.aop.MethodBeforeAdvice接口來實現(xiàn)邏輯。
該接口定義如下方法:
public void before(Method method, Object[] args, Object target)
throws Throwable;
Before()方法聲明為void,所以不用回傳任何結(jié)果,在before()執(zhí)行完畢之后,除非拋出異常,否則目標(biāo)對象上的方法就會被執(zhí)行。
示例代碼如下:

2

3

4

5


6

7


2

3

4

5

6

7

8

9

10

11

12

AfterAdvice
通過實現(xiàn)org.springframework.aop.AfterReturningAdvice接口來實現(xiàn)。
該接口定義如下方法:
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable;
示例代碼類似于BeforeAdvice。
AroundAdvice
通過實現(xiàn)org.aopalliance.intercept.MethodIntercept接口來實現(xiàn)。
該接口定義如下方法:
public Object invoke(MethodInvocation methodInvocation) throws Throwable;
示例代碼如下:

2

3

4

5

6


7

8


9

10

11

ThrowAdvice
通過實現(xiàn)org.springframework.aop.ThrowAdvice接口來實現(xiàn)。
該接口只是個標(biāo)簽接口,沒有任何方法。可以定義任意方法名稱,只要是如下形式:
methodName([Method], [args], [target], subclassOfThrowable);
其中[]表示可選。subclassOfThrowable必須是Throwable的子類。當(dāng)異常發(fā)生時,會檢驗所設(shè)定的Throw Advice中是否有符合異常類型的方法,如有則執(zhí)行。
注意:當(dāng)異常發(fā)生時,ThrowAdvice的任務(wù)只是執(zhí)行對應(yīng)的方法,并不能處理異常。當(dāng)其執(zhí)行完畢后,原來的異常仍被傳播至應(yīng)用程序之中。
Pointcut與Advisor
在Spring中,可以指定更精細的織入時機,Pointcut定義了Advice的應(yīng)用時機,在Spring中,使用PointcutAdvisor將Pointcut與Advice結(jié)合成一個對象。Spring內(nèi)建的Pointcut都有對應(yīng)的PointcutAdvisor。

2

3

4

5

6

7

NameMatchMethodPointcutAdvisor
這是最基本的PointcutAdvisor。可以指定所要應(yīng)用的目標(biāo)上的方法名稱。
示例代碼:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

Autoproxy
自動代理可以不用為每一個目標(biāo)對象手動定義代理對象,使用自動代理,可以透過Bean名稱或是Pointcut的比對,自動為符合比對條件的目標(biāo)對象建立代理對象。
BeanNameAutoProxyCreator
當(dāng)應(yīng)用程序很大時,可以為目標(biāo)對象取好適當(dāng)?shù)?font face="Courier New">Bean名稱,例如xxxService。此時可修改Bean定義文件如下:

2

3

4

5

6

7

8

9

10

11

12
