Spring AOP之原理解析(二)

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 & Advisor類圖

PointCut依賴了ClassFilterMethodMatcher,ClassFilter用來指定特定的類,MethodMatcher指定特定的函數(shù),正是由于PointCut僅有的兩個依賴,它只能實現(xiàn)函數(shù)級別的AOP。
MethodMatcher 有兩個實現(xiàn)類StaticMethodMatcherDynamicMethodMatcher,它們兩個實現(xiàn)的唯一區(qū)別是isRuntimeStaticMethodMatcher不在運行時檢測,DynamicMethodMatcher要在運行時實時檢測參數(shù),這也會導致DynamicMethodMatcher的性能相對較差。
類似繼承于StaticMethodMatcherDynamicMethodMatcher也有兩個分支StaticMethodMatcherPointcutDynamicMethodMatcherPointcut,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)系。


Advice類圖
  • 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中包含兩個部分,PointCutAdvice
AbstractPointcutAdvisor 實現(xiàn)了Ordered,為多個Advice指定順序,順序為Int類型,越小優(yōu)先級越高。

4. Proxy
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容