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:昱唯 |