上篇咱們介紹了spring容器加載的方式,並重點介紹了基於xml配置解析和註解掃描兩種容器加載的方式,封裝和註冊beandefinition的過程。今天咱們分享BeanDefinition註冊後的另外一個重要過程 ---bean的實例化過程的源碼。算法
在整個bean實例化的過程當中,spring主要乾了如下幾件大事:
1.bean的實例化過程算法;2.IOC依賴注入;3.註解支撐;4.系列BeanPostProcessors的接口執行;5.AOP動態代理構建;
下面咱們就追隨整個過程的源碼,去一探究竟...spring
AbstractApplicationContext.finishBeanFactoryInitialization()實例化bean入口方法
DefaultListableBeanFactory.preInstantiateSingletons()開始實例化流程
AbstractBeanFactory.doGetBean()抽象實例化bean骨架方法
DefaultSingletonBeanRegistry.getSingleton()獲取三個級別緩存的流程
返回factorybean中定義的對象實例,getObjectForBeanInstance()
多例狀況(Scope=ProtoType)下,有循環依賴則直接拋出異常
檢測是否抽象beandefinition對象,則直接拋出異常
緩存依賴的depend的bean對象
建立並緩存單例bean實例
建立bean實例createBean()核心封裝
反射建立bean實例
bean的依賴對象IOC注入:AbstractAutowireCapableBeanFactory.populateBean()
bean實例化後置處理,主要是AOP動態代理的建立,這個後面會詳細展開分享:initializeBean()
bean實例銷燬註冊,供外部servlet容器調用:registerDisposableBeanIfNecessary()緩存
OK,bean實例化的整個過程就先分享到這裏,後面咱們將會分享spring源碼是如何解決循環依賴的問題,AOP源碼,Spring事務源碼等諸多幹貨,請繼續關注!歡迎在下方留言關於這塊的問題,你們一塊兒探討!ide