聊聊spring之bean對象的實例化過程

在spring實例化 以前bean對象封裝成 beanDefinition 對象 想了解詳情的請參考上一篇文章html

好了 咱們聊聊 Bean 的實例化過程的幾個重要角色
BeanDefinitionRegistryPostProcessor 接口
Refresh().invokeBeanFactoryPostProcessors 這個方法裏面。
BeanDefinitionRegistryPostProcessor 這個接口的調用分爲三部:
一、調用實現了 PriorityOrdered 排序接口
二、調用實現了 Ordered 排序接口
三、沒有實現接口的調用
這個接口個人理解:獲取 BeanDefinitionRegistry 對象,獲取到這個對象就能夠獲取這個對象中註冊的
全部 BeanDefinition 對象,因此咱們知道了,咱們擁有這個對象就能夠完成裏面全部 BeanDefinition 對
象的修改新增操做

 

BeanPostProcessor 的註冊
Refresh().registerBeanPostProcessors 這個方法裏面。
拿到 BeanFactory 中全部註冊的 BeanDefinition 對象的名稱 beanName。
 
而後判斷是否實現了 PriorityOrdered 排序接口,Ordered 排序接口,getBean 是將
該 ppName 對應的 BeanDefinition 對象實例化。
把對應的 BeanPostProcessor 對象註冊到 BeanFactory 中,BeanFactory 中有一個
list 容器接收。
getSingleton 方法
代碼位置:
AbstractBeanFactory.doGetBean 方法中
 

 

 

方法裏面核心要點:

 

 

把 beanName 添加到 singletonsCurrentlyInCreation Set 容器中,在這個集合裏
面的 bean 都是正在實例化的 bean,就是實例化還沒作完的 BeanName
調到 getObject 方法,完成 bean 的實例化。接下來

 

 

getObject 調用完後,就表明着 Bean 實例化已經完成了,這時候就須要
一、singletonsCurrentlyInCreation 把 beanName 從這個集合中刪除
二、addSingleton,把 bean 緩存到一級緩存中
createBean 方法
代碼位置:
AbstractBeanFactory.doGetBean 方法中

 

這個方法是 bean 實例化核心方法

 

 

 

實例化方法,把 bean 實例化,而且包裝成 BeanWrapper
點進這個方法裏面。

 

 

這個方法是反射調用類中的 factoryMethod 方法。這要知道@Bean 方法的原理,實際上
spring 會掃描有@bean 註解的方法,而後把方法名稱設置到 BeanDefinition 的 factoryMethod
屬性中,接下來就會調到上面截圖中的方法實現@Bean 方法的調用。該方法裏面的參數解
析過程不須要了解。

 

 

determineConstructorsFromBeanPostProcessors
這個方法是 BeanPostProcessor 接口類的首次應用,最終會掉到
AutowiredAnnotationBeanPostProcessor 類的方法,在方法中會掃描有註解的構造函數而後完
成裝配過程。
相關文章
相關標籤/搜索