天天看點

springIOC-spring源碼詳解(二)

上篇文章有spring源碼介紹:

​​原創 spring源碼詳解(一)

springIOC-spring源碼詳解(二)

映入眼簾,源碼裡是大家都熟悉的三個方法,首先執行的是this(),調用構造函數,

通過AnnotatedBeanDefinitionReader這裡會讀取很多重要的初始類,

ConfigurationClassPostProcessor就是在這裡注冊,不然我們後面無法通過注解來解析和注冊bean。

這個類實作了我們上篇文章說的兩個接口,

BeanFactoryPostProcessor和BeanFactoryPostProcessorRegister。

前面說的都是注冊成功配置類,後面在refresh()裡開始解析配置類。

springIOC-spring源碼詳解(二)

這裡面會解析@bean,@importResource,@import,@ComponentScan。

後面finishBeanFactroyInitialization(beanFactory)執行個體化我們剩餘的單例bean。

springIOC-spring源碼詳解(二)

在執行個體化單執行個體的代碼如上,先會通過freezeConfiguration當機bean屬性,禁止修改,其實就是把configurationFrozen參數改為false。

springIOC-spring源碼詳解(二)

PreInstantiateSingletons()裡先擷取所有的beanNames,然後判斷不是抽象,是單例,不是懶加載的進入。

當這裡定義的bean沒有實作factoryBean的時候,則走下面的getBean()。

springIOC-spring源碼詳解(二)

前面的markBeanAsCreated就是标記目前bean正在建立的狀态。

後面getDependsOn()則是當bean有@dependsOn注解的時候,會優先加載despendsOn的bean。

springIOC-spring源碼詳解(二)
springIOC-spring源碼詳解(二)

 這裡createBean則還是建立bean,在之前getSingleton會把bean标記成正在建立,解決循環依賴的時候,正在建立很關鍵。

springIOC-spring源碼詳解(二)
springIOC-spring源碼詳解(二)
springIOC-spring源碼詳解(二)

這裡開始調用一些擴充的後置處理器,調用完之後還是正式建立bean。

調用完成之後開始執行個體化bean。

執行個體化通過反射和工廠,反射通過@component直接作用在類上,spring執行個體化。工廠則是通過new的方法,比如@bean+configuration。

getEarlyBeanRefrence解決循環依賴的。

之後popuateBean填充屬性,調用set方法進行指派。

繼續閱讀