猜測(cè)
1. 在容器啟動(dòng)時(shí)創(chuàng)建
2.在getBean時(shí)創(chuàng)建
分析源碼,在調(diào)用getBean方法時(shí),會(huì)從singletonObjects中根據(jù)beanName獲得對(duì)應(yīng)的代理對(duì)象,取出的singletonObject已經(jīng)是代理對(duì)象了,所以可以說明在容器啟動(dòng)時(shí)代理對(duì)象就已經(jīng)生成了.
下面是我分析源碼思路
1.因?yàn)檫@個(gè)代理是從singletonObjects這個(gè)容器來的,所以我需要查找這個(gè)容器的put方法在哪調(diào)用,看看這個(gè)代理類是什么時(shí)候被放入容器中的
2.找到調(diào)用方法,打上斷點(diǎn)?
3.?通過調(diào)用鏈路可得 代理對(duì)象是在DefaultSingletonBeanRegistry#getSingleton中被set進(jìn)去
5.從上面可得先從singletonObjects容器中嘗試拿 如果沒有的話再調(diào)用參數(shù)singletonFactory的getObject方法去獲得
6.那么可以看看singletonFactory的getObject在哪傳入的參數(shù)
7.再進(jìn)入createBean,可以看到doCreateBean返回了代理對(duì)象,?
此處的doCreateBean對(duì)象其實(shí)就是springIOC 創(chuàng)建bean的過程 可參考(http://www.reibang.com/p/557a87dfdef9)
8. 在spring生命周期中,有一個(gè)初始化bean方法initializeBean(),其中有一個(gè)bean的后置處理器回調(diào)applyBeanPostProcessorsAfterInitialization ,因?yàn)閟pring內(nèi)置了很多實(shí)現(xiàn)了BeanPostProcessor#postProcessAfterInitialization接口的后置處理器,那么在后置處理回調(diào)中會(huì)一個(gè)一個(gè)執(zhí)行后置處理
9.在內(nèi)置的后置處理器中,有一個(gè)后置處理器叫做AnnotationAwareAspectJAutoProxyCreator,其后置處理器邏輯中調(diào)用了wrapIfNecessary()方法
10.在wrapIfNecessary方法中,可以看到createProxy方法,在其方法中最后一步有一個(gè)getProxy方法來獲取代理
11.可以看到最后的getProxy中調(diào)用了createAopProxy().getProxy()方法 并且將classLoader作為參數(shù)傳入
12.點(diǎn)開getProxy方法可以看出,其有兩個(gè)實(shí)現(xiàn)類 一個(gè)就是JDK方式,一個(gè)就是Cglib方式
13. 以JDK方式為例子,點(diǎn)進(jìn)去看,可以看到最后調(diào)用的是JDK的Proxy.newProxyInstance方法來生成動(dòng)態(tài)代理,CGLIB則是調(diào)用ASM來實(shí)現(xiàn)動(dòng)態(tài)代理的