《Spring技術內幕》學習筆記9——AOP通知以及程式設計式AOP
1.處理AOP配置的通知基本步驟:
(1).獲取AOP配置的通知Advice:
從上一篇部落格《》對Spring中採用JDK和CGLIB兩種方式建立AOP動態代理的原始碼分析中,我們瞭解到,在AOP動態代理物件的回撥方法中,都需要使用以下方式獲取AOP配置的通知,並將獲取到的通知和目標物件、代理物件等一起封裝為ReflectiveMethodInvocation物件:
(2).建立ReflectiveMethodInvocation物件:
a.建立CglibMethodInvocation物件:
CglibMethodInvocation繼承ReflectiveMethodInvocation類,在建立時首先呼叫父類的初始化方法。
b.建立ReflectiveMethodInvocation物件:
(3).處理AOP配置的通知器:
Spring通過呼叫ReflectiveMethodInvocation類來處理AOP配置的通知,CglibMethodInvocation繼承ReflectiveMethodInvocation,因此JDK和CGLIB方式都是通過呼叫ReflectiveMethodInvocation的proceed()方法來處理通知的,處理通知的原始碼如下:
2.AOP代理建立輔助類AdvisedSupport獲取通知:
在1中我們看到,獲取AOP通知的的方法如下:
該方法會通過AOP代理建立輔助類AdvisedSupport獲取AOP配置的通知,獲取通知的過程如下:
(1).AdvisedSupport獲取給定方法的通知:
通過上面的原始碼我們看到,AdvisedSupport第一次獲取通知時,會從通知鏈容器DefaultAdvisorChainFactory中通過getInterceptorsAndDynamicInterceptionAdvice方法獲取指定的通知。
(2).DefaultAdvisorChainFactory獲取指類,指定方法的通知:
DefaultAdvisorChainFactory通過getInterceptorsAndDynamicInterceptionAdvice方法獲取指定類中指定方法的通知,原始碼如下:
通過上面DefaultAdvisorChainFactory獲取通知過程原始碼的分析,我們看到通過AdvisorAdapterRegistry的getInterceptors方法獲取通知器的通知,AdvisorAdapterRegistry是一個介面,具體的實現交由其實現類DefaultAdvisorAdapterRegistry提供。
3.DefaultAdvisorAdapterRegistry獲取通知器的通知:
DefaultAdvisorAdapterRegistry的原始碼如下:
從上述程式碼獲取通知原始碼分析中我們看到,DefaultAdvisorAdapterRegistry的getInterceptors方法中,需要將AOP配置的通知封裝為通知介面卡,下面我們繼續分析通知介面卡的主要原始碼和功能。
4.通知介面卡:
通知介面卡AdvisorAdapter對通知進行封裝,為通知提供Spring AOP的增強功能,下面我們以MethodBeforeAdviceAdapter為例,分析通知介面卡的具體功能:
(1).MethodBeforeAdviceAdapter原始碼:
通過對MethodBeforeAdviceAdapter的原始碼分析,我們看到通知介面卡在獲取到通知器的通知後,將通知封裝為方法攔截器,我們接下來分析MethodBeforeAdviceInterceptor是如何將通知封裝為方法攔截器的。
MethodBeforeAdviceInterceptor封裝通知實現了Spring AOP的織入功能,其原始碼如下:
首先,為目標物件物件建立AOP代理物件,根據AOP配置獲取通知器,通知器中持有切入點和通知。
其次,根據通知器中的切入點,獲取目標類目標方法的通知,並將通知封裝為攔截器,新增到代理攔截鏈中。
最後,呼叫目標物件目標方法時,呼叫AOP代理物件,根據通知在呼叫目標物件方法時觸發呼叫通知鏈中通知攔截器的回撥方法。
5.方法攔截器:
在4中我們已經分析了MethodBeforeAdviceInterceptor原始碼,瞭解到方法攔截器主要作用是根據通知型別在呼叫目標方法時觸發通知的回撥,我們接下來分析AfterReturningAdviceInterceptor和ThrowsAdviceInterceptor攔截器的原始碼,瞭解對後置通知和異常通知的處理實現:
(2).ThrowsAdviceInterceptor:
異常通知攔截器ThrowsAdviceInterceptor和前置通知攔截器MethodBeforeAdviceInterceptor、後置通知攔截器AfterReturningAdviceInterceptor類似,不同之處在於需要維護異常處理器,因此更加複雜,原始碼如下:
6.ProxyFactory實現程式設計式AOP:
在上一篇部落格《》中,我們以ProxyFactoryBean 為例,分析了Spring建立AOP代理物件以及對目標物件進行切面攔截的實現過程,在Spring中還有另一個建立AOP代理物件的容器——ProxyFactory,兩個建立AOP代理物件容器的區別如下:
a.ProxyFactory:建立程式設計式的Spring AOP應用。
b.ProxyFactoryBean:建立宣告式的Spring AOP應用。
我們現在通過分析ProxyFactory原始碼,瞭解Spring程式設計式AOP應用的具體實現:
(1).使用ProxyFactory程式設計式AOP應用的簡單例子:
(2).ProxyFactory原始碼:
通過上述對ProxyFactory原始碼的分析可以看出,獲取代理物件的getProxy()方法中,呼叫ProxyCreatorSupport的createAopProxy()方法獲得DefaultAopProxyFactory物件,通過呼叫DefaultAopProxyFactory類的createAopProxy方法來呼叫JDK或者CGLIB建立AOP代理物件,與ProxyFactoryBean實現原理相同,通知的配置以及方法的通知鏈攔截呼叫等都與ProxyFactoryBean完全相同,這裡不再贅述,請實現參考上一篇部落格對ProxyFactoryBean的分析。