所有文章已遷移至csdn,csdn個(gè)人主頁https://blog.csdn.net/chaitoudaren
前言
MyBean myTestBean = (MyBean) bf.getBean("myBean");
經(jīng)歷了第一階段,Xml相關(guān)配置文件已經(jīng)轉(zhuǎn)換成了XmlBeanFactory的內(nèi)部表示。通過getBean("myBean"),Spring將在Map中查詢出key="myBean"的BeanDefinition。再通過獲取BeanDefinition的class,構(gòu)造函數(shù)等信息,對(duì)Bean進(jìn)行以下3個(gè)步驟(當(dāng)然spring還有許多PostProcessors,AOP的介入等,暫且抓住主線):
- createBeanInstance:實(shí)例化,就是調(diào)用對(duì)應(yīng)的構(gòu)造方法構(gòu)造對(duì)象
- populateBean:填充屬性,這步對(duì)spring xml中指定的property進(jìn)行populate填充
- initializeBean:初始化,調(diào)用spring xml中指定的init方法,或者AfterPropertiesSet方法
最終生成用戶所需要的Bean對(duì)象返回給用戶,同時(shí)spring會(huì)根據(jù)scope的范圍進(jìn)行緩存,保存到不同的緩存中,以供下次調(diào)用,提高框架效率。下圖是spring創(chuàng)建bean的順序圖,也可以說是spring bean的生命周期,具體怎么驗(yàn)證請(qǐng)參考:spring BeanPostProcessor 生命周期

spring創(chuàng)建Bean .jpg
重點(diǎn)(必讀)
下面要講的幾點(diǎn)在開始第二階段學(xué)習(xí)之前請(qǐng)務(wù)必記牢,說起來很簡單,但是很多教程甚至是書本都出現(xiàn)的混淆。以下幾點(diǎn)對(duì)理清第二階段的脈絡(luò)至關(guān)重要。
- Instance:實(shí)例化,也就是調(diào)用構(gòu)造函數(shù)的過程,至此將通過調(diào)用class的構(gòu)造方法生成一個(gè)對(duì)象,但是尚未進(jìn)行屬性填充以及初始化。這里切記切記不要跟初始化混淆,這里很多文章會(huì)寫成初始化,實(shí)例化就是實(shí)例化,不是初始化!切記切記!
- populateBean:填充屬性,這步對(duì)spring xml中指定的property進(jìn)行populate填充,當(dāng)然@Autowired屬性也是在這里注入的。(@Autowired如果標(biāo)記在構(gòu)造函數(shù)上,則是在上一步Instance階段做的)
- initialize:初始化,這個(gè)才是初始化。它是通過調(diào)用Instance生產(chǎn)的對(duì)象中自定義的init-method方法進(jìn)行初始化的。這個(gè)才是初始化,不要跟實(shí)例化混淆!
- postProcessors:后置處理器,這是spring安插在各個(gè)階段前后的方法。例如在initalizeBean前后可以通過重寫applyBeanPostProcessorsBeforeInitialization、applyBeanPostProcessorsAfterInitialization方法進(jìn)行一些自定義操作。所以后置處理器是有before和after區(qū)別的,別被這么名字混淆,后置處理器有before前置處理也有after后置處理