當前位置:
首頁 > 知識 > Spring AOP(三)Advisor類架構

Spring AOP(三)Advisor類架構

如果從代碼執行角度來看,Spring AOP的執行過程分為四大步驟:

步驟一:Spring框架生成Advisor實例,可以是 , 等註解生成的實例,也可以是程序員自定義的 子類的實例。

步驟二:Spring框架在目標實例初始化完成後,也就是使用 的 方法,根據Advisor實例中切入點 的定義,選擇出適合該目標對象的Advisor實例。

步驟三:Spring框架根據Advisor實例生成代理對象。

步驟四:調用方法執行過程時,Spring框架執行Advisor實例的通知 邏輯。

?由於這四個步驟涉及的源碼量較大,一篇文章無法直接完全講解完,本篇文章只講解第一步 實例生成的源碼分析。接下來的文章我們就依次講解一下後續步驟中比較關鍵的邏輯。

Advisor類架構

? Spring中有大量的機制都是通過AOP實現的,比如說 的非同步調用和 。此外,用戶也可以使用 註解定義切面或者直接繼承 來提供切面邏輯。上述這些情況下,AOP都會生成對應的Advisor實例。

?我們先來看一下Advisor的相關類圖。首先看一下 包下的類圖。aopalliance是AOP組織下的公用包,用於AOP中方法增強和調用,相當於一個jsr標準,只有介面和異常,在AspectJ、Spring等AOP框架中使用。

?aopalliance定義了AOP的通知 和連接點 介面,並且還有繼承上述介面的 和 。這兩個類相信大家都很熟悉。

?然後我們來看一下Spring AOP中Advisor相關的類圖。Advisor是Spring AOP獨有的概念,比較重要的類有 和 。相關的講解都在圖中表明了,如果這張圖中的概念和類同學們都熟識,那麼對AOP的了解就已經很深入了。


獲取所有 實例

?AOP生成Advisor實例的函數入口是 的 函數。

?相關的ProxyCreator也有一個類體系,不過太過繁雜,而且重要性不大,我們就先略過,直接將具體的類。由上邊代碼可知 的 函數是直接獲取Spring容器中的 實例,比如說 實例,或者說我們自定義的 的子類實例。 的 函數通過 的 獲取了所有類型為 的實例。

?而 看其類名就可知,是與AspectJ相關的創建器,用來獲取 定義的Advisor實例,也就是 實例。

?接下去我們看一下 的 函數,它根據 修飾的切面實例生成對應的 實例。

? 函數執行時分為兩種情況,第一個未初始化時,也就是 為null時,執行 進行第一次初始化,在這一過程中生成切面名稱列表 和要返回的 列表,並且將生成的 實例放置到 中。

?第二種情況則是已經初始化後再次調用,遍歷 ,從 取出對應的 實例,或者從 取出Advisor對應的工廠類對象,再次生成 實例。

? 函數的邏輯如下:

首先使用 獲取了BeanFactory中所有的BeanName,然後進而使用 獲取所有的Bean實例。

遍歷Bean實例,通過 的 函數判斷該實例是否為切面實例,也就是被 註解修飾的實例。

如果是,則使用 ,根據切面實例的定義來生成對應的多個 實例,並且將其加入到 中。

生成InstantiationModelAwarePointcutAdvisorImpl實例

? 的 函數會獲取 修飾的實例中所有沒有被 修飾的方法,然後調用 函數,並且將這些方法作為參數。

? 函數就是根據作為參數傳入的切面實例的方法上的註解來生成Advisor實例,也就是 對象。依據方法上的切入點表達式生成 。 ?

我們都知道 實例中必然有一個 和 實例。修飾在方法上的註解包括: , , , , 和 ,所以 會依據不同的不同的註解生成不同的 通知。

? 的構造函數中會生成對應的 和 。 函數調用了 的 函數。

?至此,Spring AOP就獲取了容器中所有的 實例,下一步在每個實例初始化完成後,根據這些 的 切入點進行篩選,獲取合適的 實例,並生成代理實例。


後記

?Spring AOP後續文章很快就會更新,請大家繼續關注。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 昱唯 的精彩文章:

如何選擇限流演算法

TAG:昱唯 |