spring aop生成代理對象的時間

猜測

1. 在容器啟動時創(chuàng)建

2.在getBean時創(chuàng)建



分析源碼,在調(diào)用getBean方法時,會從singletonObjects中根據(jù)beanName獲得對應(yīng)的代理對象,取出的singletonObject已經(jīng)是代理對象了,所以可以說明在容器啟動時代理對象就已經(jīng)生成了.



下面是我分析源碼思路

1.因?yàn)檫@個代理是從singletonObjects這個容器來的,所以我需要查找這個容器的put方法在哪調(diào)用,看看這個代理類是什么時候被放入容器中的

scope 全局搜索

2.找到調(diào)用方法,打上斷點(diǎn)?

3.?通過調(diào)用鏈路可得 代理對象是在DefaultSingletonBeanRegistry#getSingleton中被set進(jìn)去


5.從上面可得先從singletonObjects容器中嘗試拿 如果沒有的話再調(diào)用參數(shù)singletonFactory的getObject方法去獲得


6.那么可以看看singletonFactory的getObject在哪傳入的參數(shù)


7.再進(jìn)入createBean,可以看到doCreateBean返回了代理對象,?

此處的doCreateBean對象其實(shí)就是springIOC 創(chuàng)建bean的過程 可參考(http://www.itdecent.cn/p/557a87dfdef9)

8. 在spring生命周期中,有一個初始化bean方法initializeBean(),其中有一個bean的后置處理器回調(diào)applyBeanPostProcessorsAfterInitialization ,因?yàn)閟pring內(nèi)置了很多實(shí)現(xiàn)了BeanPostProcessor#postProcessAfterInitialization接口的后置處理器,那么在后置處理回調(diào)中會一個一個執(zhí)行后置處理


9.在內(nèi)置的后置處理器中,有一個后置處理器叫做AnnotationAwareAspectJAutoProxyCreator,其后置處理器邏輯中調(diào)用了wrapIfNecessary()方法

10.在wrapIfNecessary方法中,可以看到createProxy方法,在其方法中最后一步有一個getProxy方法來獲取代理

11.可以看到最后的getProxy中調(diào)用了createAopProxy().getProxy()方法 并且將classLoader作為參數(shù)傳入

12.點(diǎn)開getProxy方法可以看出,其有兩個實(shí)現(xiàn)類 一個就是JDK方式,一個就是Cglib方式


13. 以JDK方式為例子,點(diǎn)進(jìn)去看,可以看到最后調(diào)用的是JDK的Proxy.newProxyInstance方法來生成動態(tài)代理,CGLIB則是調(diào)用ASM來實(shí)現(xiàn)動態(tài)代理的


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容