ProxyFactoryBean生成AopProxy代理對象-3

Spring Aop的使用中,可以通過ProxyFactoryBean來配置目標對象和切面行爲。在ProxyFactoryBean中,通過interceptorNames屬性來配置已經定義好的通知器Advistor。雖然名字爲interceptorNames,但實際上確實供Aop應用配置通知器的地方。在ProxyFactoryBean中,需要爲target目標對象生成Proxy代理對象,從而爲Aop橫切面的編織做好準備工作。而代理對象的生成,在ProxyFactoryBeanAop實現需要依賴JDK或者CGLIB提供的Proxy特性。

下面我們從PeroxyFactoryBean進行分析。從ProxyFactoryBean中獲取對象,是以getObject方法作爲入口完成的;ProxyFactoryBean實現中的getObject()方法,是FactoryBean需要實現的接口。對ProxyFactoryBean來說,需要把目標對象增加的增強處理,都通過了getObject方法進行了封裝,這些增強處理是爲AOP功能的實現提供服務的。getObject的實現清單如下getObect()方法首先對通知器進行了初始化,通知器封裝了一系列的攔截器,這些攔截器都要從配置文件中獲取,然後爲代理對象的生成做好準備。在生成代理對象時,因爲Spring中有singleton類型和prototype類型這兩種不同的bean,所有要對代理對象進行一個區分。

生成代理對象AopProxy入口方法調用流程圖:

 

 

ProxyFactoryBeangetObject

 

———————————————————————————————————————------------------------


getObject方法中,首先是對通知器鏈進行初始化initializeAdvisorChain()

 

 

initializeAdvisorChain方法中通過ioc容器獲取到interceptor對象後將繼續調用addAdvisorOnChainCreation()interceptor對象添加到通知器鏈中

 

addAdvisorOnChainCreation()方法中首先會調用namedBeanToAdvisor(next)方法,將從ioc容器獲取的普通對象轉換成通知器Advisor對象。

 

namedBeanToAdvisor()方法中將會繼續調用AdvisorAdapterRegistry接口的默認實現DefaultAdvisorAdapterRegistry類中的wrap方法進行轉換,繼續看wrap方法

 

 

wrap方法中,首相判斷傳入的對象是否是advisor對象,如果是則直接強轉爲Advisor後返回,如果沒有實現Advice通知則直接拋出異常,如果實現了Advice通知則直接強轉爲Advice再判斷是否是MethodInteceptor的子類,如果是,直接產生默認的advisor,如果是adapters中的任意子類,則也生成默認的advisor。這裏的adapters具體是指DefaultAdvisorAdapterRegistry類中的adapters屬性,就是advice通知所要繼承的類,也就是在哪裏進行切入,如前置通知,後置通知,異常通知

 

 

以上就是初始化advisor鏈,生成代理的核心數據。

———————————————————————————————————————--------------------


接着在getObject()方法中,將會執行getSingletonInstance()方法,該方法主要是生成代理對象並封裝對target目標對象的調用(即加入攔截器)。具體的生成過程是,首先讀取ProxyFactoryBean中的配置,爲生成代理對象做好必要的準備,比如設置代理的方法接口調用等。Spring通過AopProxy類來具體生成代理對象。對於getSingletonInstance()方法中代理對象的生成過程,代碼清單如下:

 

首先是獲取代理對象的接口並調用setInterfaces()方法設置代理對象的接口,然後通過調用ProxyCreatorSupport類中的createAopProxy()方法,在ProxyCreatorSupport類中存在一個aopProxyFactory屬性,默認爲DefaultAopProxyFactory類型,在ProxyCreatorSupport類中的createAopProxy()方法中,通過調用DefaultAopProxyFactory類中的createAopProxy()方法來生成代理對象。以下是ProxyCreatorSupport類中的主要方法

 


 

 

 

這裏的this參數主要是傳遞通知器鏈,因爲ProxyCreatorSupport繼承了AdivsedSupport類,因此這裏傳遞的就是advice通知器鏈。

 

DefaultAopProxyFactory類中,將會調用createAopProxy()來生成代理對象,關於AopProxy代理對象的生成,需要考慮使用哪種方式,如果目標對象是接口類,那麼適合使用JDK來生成代理對象,否則Spring會使用CGLIB來生成目標對象的代理對象。爲了滿足不同的代理對象的生成要求,DefaultAopProxyFactory作爲AopProxy對象的生產工廠,可以根據不同的需要生成這兩種AopProxy對象。具體代碼如下:

 

這裏我們主要看JDK生成代理對象,這裏的new JdkDynamicAopProxy(config) 主要是設置advice通知屬性到將要生成的代理對象中,並返回一個JdkDynamicAopProxy類型的對象。接着在ProxyCreatorSupport類中將會調用本類的getProxy()方法:

 

getProxy()方法中,傳遞的aopProxy是上面方法傳遞回來的JdkDynamicAopProxy對象。這個aopProxy通過調用JdkDynamicAopProxy類中的getProxy方法來生成具體的代理對象,代碼如下:

 

 

最後通過調用Proxy.newProxyInstance()方法生成代理對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章