天天看點

Spring容器建立過程——建立BeanBean的建立

Bean

的建立

11、

refresh()

方法調用

finishBeanFactoryInitialization()

方法,初始化剩下的所有單執行個體bean

Spring容器建立過程——建立BeanBean的建立

finishBeanFactoryInitialization()

方法調用

preInstantiateSingletons()

方法執行個體化剩下的所有單執行個體bean

Spring容器建立過程——建立BeanBean的建立

首先擷取到所有定義的bean,然後依次進行建立和初始化對象

Spring容器建立過程——建立BeanBean的建立

然後周遊所有的bean,擷取bean的定義資訊

Spring容器建立過程——建立BeanBean的建立

接着會判斷目前bean是否不是抽象的,且是否是單執行個體,而且是否是懶加載的

Spring容器建立過程——建立BeanBean的建立

如果是,則進一步判斷目前

bean

是否是

FactoryBean

,即判斷是否實作了

FactoryBean

接口的

bean

,如果是工廠bean,就會調用接口中

getObject()

方法來建立對象

Spring容器建立過程——建立BeanBean的建立

如果不是工廠bean就會調用

getBean()

方法來建立對象

Spring容器建立過程——建立BeanBean的建立

getBean()

方法進一步調用doGetBean()方法

Spring容器建立過程——建立BeanBean的建立

拿到bean的名字之後,先調用

getSingleton()

方法擷取緩存中的單執行個體bean,如果能擷取到,就說明這個bean之前已經被建立過了,因為所有建立過的單執行個體bean都會被緩存起來

Spring容器建立過程——建立BeanBean的建立

如果緩存中擷取不到,就開始bean的建立對象流程

首先标記目前bean已被建立,防止多線程建立同一個bean

Spring容器建立過程——建立BeanBean的建立

然後擷取bean定義資訊

Spring容器建立過程——建立BeanBean的建立

接着擷取目前bean依賴的其它bean,如果有依賴就會調用

getBean()

方法把依賴的bean先建立出來

Spring容器建立過程——建立BeanBean的建立

如果目前bean單執行個體bean就會啟動單執行個體bean建立流程,會調用

getSingleton()

方法通過工廠的

getObject()

方法調用

createBean()

來建立bean

Spring容器建立過程——建立BeanBean的建立

createBean()

會先擷取bean的定義資訊

Spring容器建立過程——建立BeanBean的建立

然後解析bean的類型

Spring容器建立過程——建立BeanBean的建立

createBean()

會調用

resolveBeforeInstantiation()

方法,在執行個體化之前,讓

BeanPostProcessor

先攔截傳回代理對象。

Spring容器建立過程——建立BeanBean的建立

正常的

BeanPostProcessor

都是在對象建立完後,初始化前後來進行攔截,而這裡的後置處理器是

InstantiationAwareBeanPostProcessor

類型,在建立對象之前就會進行攔截。如果是

InstantiationAwareBeanPostProcessor

類型就會調用

applyBeanPostProcessorsBeforeInstantiation()

方法

Spring容器建立過程——建立BeanBean的建立

applyBeanPostProcessorsBeforeInstantiation()

方法會觸發

postProcessBeforeInstantiation()

方法,後置處理器會在建立對象前進行攔截

Spring容器建立過程——建立BeanBean的建立

如果有傳回值,就會調用

applyBeanPostProcessorsAfterInitialization()

方法

Spring容器建立過程——建立BeanBean的建立

applyBeanPostProcessorsAfterInitialization()

方法會觸發

postProcessAfterInitialization()

方法,在建立對象之後執行攔截處理

Spring容器建立過程——建立BeanBean的建立

如果前面的

resolveBeforeInstantiation()

方法沒有傳回一個代理對象,就會調用

doCreateBean()

方法傳回一個Bean執行個體

Spring容器建立過程——建立BeanBean的建立

doCreateBean()

會調用

createBeanInstance()

方法建立一個bean執行個體

Spring容器建立過程——建立BeanBean的建立

createBeanInstance()

方法利用工廠方法或者對象的構造器建立出bean執行個體

Spring容器建立過程——建立BeanBean的建立

doCreateBean()

方法在調用

createBeanInstance()

方法建立出bean對象之後,可以調用

applyMergedBeanDefinitionPostProcessors()

方法允許後置處理器修改一些bean的定義

Spring容器建立過程——建立BeanBean的建立

applyMergedBeanDefinitionPostProcessors()

方法周遊所有的後置處理器,如果是

MergedBeanDefinitionPostProcessor

類型的,就會調用

postProcessMergedBeanDefinition()

方法

Spring容器建立過程——建立BeanBean的建立

doCreateBean()

方法完成bean的建立之後,會調用

populateBean()

為建立出來的bean進行屬性指派

Spring容器建立過程——建立BeanBean的建立

在指派之前,會先擷取

InstantiationAwareBeanPostProcessor

後置處理器,執行這個類型後置處理器的

postProcessAfterInstantiation()

方法,在執行個體化之後初始化之前進行攔截處理

Spring容器建立過程——建立BeanBean的建立

然後,繼續擷取

InstantiationAwareBeanPostProcessor

後置處理器,執行這個類型後置處理器的

postProcessPropertyValues()

方法,傳回bean的屬性值

Spring容器建立過程——建立BeanBean的建立

最後才調用

applyPropertyValues()

方法應用傳回的bean的屬性值,利用反射調用

setter

方法進行屬性指派。此時完成屬性的指派工作

Spring容器建立過程——建立BeanBean的建立

完成屬性指派之後,會調用

initializeBean()

方法來初始化bean

Spring容器建立過程——建立BeanBean的建立

initializeBean()

方法會調用

invokeAwareMethods()

方法,執行實作各種

Aware

接口的方法

Spring容器建立過程——建立BeanBean的建立

然後調用

applyBeanPostProcessorsBeforeInitialization()

方法,讓後置處理器在bean初始化之前進行攔截

Spring容器建立過程——建立BeanBean的建立

applyBeanPostProcessorsBeforeInitialization()

方法會周遊所有的後置處理器,執行每個後置處理器的

postProcessBeforeInitialization()

方法

Spring容器建立過程——建立BeanBean的建立

初始化之前的後置處理器執行完之後,就會調用

invokeInitMethods()

方法,執行初始化方法

Spring容器建立過程——建立BeanBean的建立

invokeInitMethods()

方法執行bean的初始化操作

Spring容器建立過程——建立BeanBean的建立

初始化結束之後,會調用

applyBeanPostProcessorsAfterInitialization()

方法,執行初始化之後的後置處理器操作

Spring容器建立過程——建立BeanBean的建立

applyBeanPostProcessorsAfterInitialization()

方法周遊所有的後置處理器,執行

postProcessAfterInitialization()

方法

Spring容器建立過程——建立BeanBean的建立

至此bean的初始化完成

初始化執行完成之後,會調用

registerDisposableBeanIfNecessary()

方法注冊bean的銷毀方法

Spring容器建立過程——建立BeanBean的建立

至此

doCreateBean()

方法執行結束,傳回一個bean執行個體

所有Bean都利用

getBean()

方法建立完成以後,會檢查所有的Bean是否實作了

SmartInitializingSingleton

接口,如果是就執行

afterSingletonsInstantiated()

方法

Spring容器建立過程——建立BeanBean的建立