上篇文章有spring源碼介紹:
原創 spring源碼詳解(一)

映入眼簾,源碼裡是大家都熟悉的三個方法,首先執行的是this(),調用構造函數,
通過AnnotatedBeanDefinitionReader這裡會讀取很多重要的初始類,
ConfigurationClassPostProcessor就是在這裡注冊,不然我們後面無法通過注解來解析和注冊bean。
這個類實作了我們上篇文章說的兩個接口,
BeanFactoryPostProcessor和BeanFactoryPostProcessorRegister。
前面說的都是注冊成功配置類,後面在refresh()裡開始解析配置類。
這裡面會解析@bean,@importResource,@import,@ComponentScan。
後面finishBeanFactroyInitialization(beanFactory)執行個體化我們剩餘的單例bean。
在執行個體化單執行個體的代碼如上,先會通過freezeConfiguration當機bean屬性,禁止修改,其實就是把configurationFrozen參數改為false。
PreInstantiateSingletons()裡先擷取所有的beanNames,然後判斷不是抽象,是單例,不是懶加載的進入。
當這裡定義的bean沒有實作factoryBean的時候,則走下面的getBean()。
前面的markBeanAsCreated就是标記目前bean正在建立的狀态。
後面getDependsOn()則是當bean有@dependsOn注解的時候,會優先加載despendsOn的bean。
這裡createBean則還是建立bean,在之前getSingleton會把bean标記成正在建立,解決循環依賴的時候,正在建立很關鍵。
這裡開始調用一些擴充的後置處理器,調用完之後還是正式建立bean。
調用完成之後開始執行個體化bean。
執行個體化通過反射和工廠,反射通過@component直接作用在類上,spring執行個體化。工廠則是通過new的方法,比如@bean+configuration。
getEarlyBeanRefrence解決循環依賴的。
之後popuateBean填充屬性,調用set方法進行指派。