我們在這篇文章中接着上一篇文章的分析。我們在上一篇文章中分析了建立AspectJProxyFactory,并向AspectJProxyFactory中添加目标對象和擷取目标對象的過程。我們在這一篇文章中分析調用addAspect方法添加切面的過程。
在AspectJProxyFactory中有兩個addAspect重載方法,一個入參是切面執行個體對象,一個入參是切面類對象。他們兩個的差別是:傳入執行個體對象的方法會将執行個體對象封裝為一個單例不再進行切面對象的場景,傳入切面類對象的方法需要建立切面對象執行個體。我們分析入參為切面類對象的方法。代碼如下:
上面的代碼隻調用了createAspectMetadata、createAspectInstanceFactory、addAdvisorsFromAspectInstanceFactory這三個方法,但是這個過程卻是很複雜的。我們先看createAspectMetadata這個方法。
我們先看看AspectMetadata 這個類是個什麼東西。
AspectMetadata這個類中主要存儲了切面類的名字、切面類對象和AspectJ中定義的存儲切面類Class對象的類以及SpringAOP中的切點表達式。
createAspectMetadata方法的内容如下:
AspectMetadata的構造函數: 在這個構造函數裡主要是查找帶有@Aspect注解的類。擷取@Aspect類的PerClause類型。正常都是SINGLETON。
我們在看createAspectInstanceFactory這個方法的内容:
這個方法主要是建立了一個MetadataAwareAspectInstanceFactory 的子類。用來組合切面執行個體對象和切面中繼資料。面向接口程式設計的一個很好的展現(依賴倒轉)。MetadataAwareAspectInstanceFactory有很多子類,在不同的場景下建立不同用途的執行個體。其UML類圖如下:
我們先看建立SingletonMetadataAwareAspectInstanceFactory的構造函數:
addAdvisorsFromAspectInstanceFactory這個方法,應該是我們這次要分析的重點方法了,擷取Advisor的邏輯都在這個方法中。其代碼如下:
對于上面的代碼我們一步一步的分析。先從this.aspectFactory.getAdvisors這裡開始。這裡的aspectFactory為ReflectiveAspectJAdvisorFactory。在SpringAOP中從Aspect中擷取Advisor都是使用的ReflectiveAspectJAdvisorFactory這個類。這個類是AspectJAdvisorFactory的子類,他們的關系如下:
AbstractAspectJAdvisorFactory和ReflectiveAspectJAdvisorFactory中很重要的類。他們的重要性在我們後面的分析中會慢慢的展現出來。
ReflectiveAspectJAdvisorFactory中的getAdvisors方法内容如下:
繼續getAdvisors方法中下面的内容
剩下的内容我們下一章繼續分析。