spring源碼解析 - spring容器加載源碼(bean實例化過程)

前言

上篇咱們介紹了spring容器加載的方式,並重點介紹了基於xml配置解析和註解掃描兩種容器加載的方式,封裝和註冊beandefinition的過程。今天咱們分享BeanDefinition註冊後的另外一個重要過程 ---bean的實例化過程的源碼。算法

容器加載流程

spring源碼解析 - spring容器加載源碼(bean實例化過程)
在整個bean實例化的過程當中,spring主要乾了如下幾件大事:
1.bean的實例化過程算法;2.IOC依賴注入;3.註解支撐;4.系列BeanPostProcessors的接口執行;5.AOP動態代理構建;
下面咱們就追隨整個過程的源碼,去一探究竟...spring

AbstractApplicationContext.finishBeanFactoryInitialization()實例化bean入口方法
spring源碼解析 - spring容器加載源碼(bean實例化過程)
DefaultListableBeanFactory.preInstantiateSingletons()開始實例化流程
spring源碼解析 - spring容器加載源碼(bean實例化過程)
AbstractBeanFactory.doGetBean()抽象實例化bean骨架方法
spring源碼解析 - spring容器加載源碼(bean實例化過程)
DefaultSingletonBeanRegistry.getSingleton()獲取三個級別緩存的流程
spring源碼解析 - spring容器加載源碼(bean實例化過程)
返回factorybean中定義的對象實例,getObjectForBeanInstance()
spring源碼解析 - spring容器加載源碼(bean實例化過程)
spring源碼解析 - spring容器加載源碼(bean實例化過程)
多例狀況(Scope=ProtoType)下,有循環依賴則直接拋出異常
spring源碼解析 - spring容器加載源碼(bean實例化過程)
檢測是否抽象beandefinition對象,則直接拋出異常
spring源碼解析 - spring容器加載源碼(bean實例化過程)
緩存依賴的depend的bean對象
spring源碼解析 - spring容器加載源碼(bean實例化過程)
建立並緩存單例bean實例
spring源碼解析 - spring容器加載源碼(bean實例化過程)
spring源碼解析 - spring容器加載源碼(bean實例化過程)
建立bean實例createBean()核心封裝
spring源碼解析 - spring容器加載源碼(bean實例化過程)
spring源碼解析 - spring容器加載源碼(bean實例化過程)
反射建立bean實例
spring源碼解析 - spring容器加載源碼(bean實例化過程)
spring源碼解析 - spring容器加載源碼(bean實例化過程)
spring源碼解析 - spring容器加載源碼(bean實例化過程)
spring源碼解析 - spring容器加載源碼(bean實例化過程)
spring源碼解析 - spring容器加載源碼(bean實例化過程)
spring源碼解析 - spring容器加載源碼(bean實例化過程)
bean的依賴對象IOC注入:AbstractAutowireCapableBeanFactory.populateBean()
spring源碼解析 - spring容器加載源碼(bean實例化過程)
bean實例化後置處理,主要是AOP動態代理的建立,這個後面會詳細展開分享:initializeBean()
spring源碼解析 - spring容器加載源碼(bean實例化過程)
bean實例銷燬註冊,供外部servlet容器調用:registerDisposableBeanIfNecessary()
spring源碼解析 - spring容器加載源碼(bean實例化過程)
spring源碼解析 - spring容器加載源碼(bean實例化過程)緩存

調用時序

spring源碼解析 - spring容器加載源碼(bean實例化過程)

總結

OK,bean實例化的整個過程就先分享到這裏,後面咱們將會分享spring源碼是如何解決循環依賴的問題,AOP源碼,Spring事務源碼等諸多幹貨,請繼續關注!歡迎在下方留言關於這塊的問題,你們一塊兒探討!ide

相關文章
相關標籤/搜索