AOP的幾大關(guān)鍵部分:
1. PointCut
即在哪個地方進行切入,它可以指定某一個點,也可以指定多個點。
比如類A的methord函數(shù),當然一般的AOP與語言(AOL)會采用多用方式來定義PointCut,比如說利用正則表達式,可以同時指定多個類的多個函數(shù)。
2. Advice
在切入點干什么,指定在PointCut地方做什么事情(增強),打日志、執(zhí)行緩存、處理異常等等。
3. Advisor/Aspect
PointCut + Advice 形成了切面Aspect,這個概念本身即代表切面的所有元素。但到這一地步并不是完整的,因為還不知道如何將切面植入到代碼中,解決此問題的技術(shù)就是PROXY。
4. Proxy
Proxy 即代理,其不能算做AOP的家庭成員,更相當于一個管理部門,它管理 了AOP的如何融入OOP。之所以將其放在這里,是因為Aspect雖然是面向切面核心思想的重要組成部分,但其思想的踐行者卻是Proxy,也是實現(xiàn)AOP的難點與核心據(jù)在。
Spring AOP中各部分的實現(xiàn)
1. PointCut
參考下面的手工類圖,以PointCut為核心展開,只列舉了幾個關(guān)鍵類。

PointCut依賴了ClassFilter和MethodMatcher,ClassFilter用來指定特定的類,MethodMatcher指定特定的函數(shù),正是由于PointCut僅有的兩個依賴,它只能實現(xiàn)函數(shù)級別的AOP。
MethodMatcher 有兩個實現(xiàn)類StaticMethodMatcher和DynamicMethodMatcher,它們兩個實現(xiàn)的唯一區(qū)別是isRuntime。StaticMethodMatcher不在運行時檢測,DynamicMethodMatcher要在運行時實時檢測參數(shù),這也會導致DynamicMethodMatcher的性能相對較差。
類似繼承于StaticMethodMatcher和DynamicMethodMatcher也有兩個分支StaticMethodMatcherPointcut和DynamicMethodMatcherPointcut,StaticMethodMatcherPointcut是我們最常用,其具體實現(xiàn)有兩個:
-
NameMatchMethodPointcut: 通過name進行匹配。 -
JdkRegexpMethodPointcut:通過正則表達式匹配。
其他PointCut: -
ExpressionPointcut,它的出現(xiàn)是了對AspectJ的支持,所以其具體實現(xiàn)也有AspectJExpressionPointcut
另外還有三個更強功能的PointCut: -
AnnotationMatchingPointcut:可以指定某種類型的注解 -
ComposiblePointcut:進行與或操作 -
ControlFlowPointcut:這個有些特殊,它是一種控制流,例如類A 調(diào)用B.method(),它可以指定當被A調(diào)用時才進行攔截。
2. Advice
參考如下手工類圖,不完整,但是可以代表基本的類和接口關(guān)系。

-
AfterAdvice是指函數(shù)調(diào)用結(jié)束之后增強,它又包括兩種情況:
-- 異常退出ThrowsAdvice
-- 正常退出AfterReturningAdvice -
BeforeAdvice指函數(shù)調(diào)用之前增強; -
Inteceptor有點特殊,它是由AOP聯(lián)盟定義的標準,也是為了方便Spring AOP擴展,以便對其它AOL支持。每個Interceptor里都包含一個對應Advice的實例。
3. Advisor/Aspect
參考上面第一個圖。我們主要研究PointCutAdvisor。
首先對每個不同類型的PointCut,對應一個相應類型的PointCutAdvisor。
而每個Advisor中包含兩個部分,PointCut和Advice。
AbstractPointcutAdvisor 實現(xiàn)了Ordered,為多個Advice指定順序,順序為Int類型,越小優(yōu)先級越高。