Spring bean對象實(shí)例化實(shí)現(xiàn)過程圖解
好了 我們聊聊 Bean 的實(shí)例化過程的幾個(gè)重要角色
BeanDefinitionRegistryPostProcessor 接口
Refresh().invokeBeanFactoryPostProcessors 這個(gè)方法里面。
BeanDefinitionRegistryPostProcessor 這個(gè)接口的調(diào)用分為三部:
1、調(diào)用實(shí)現(xiàn)了 PriorityOrdered 排序接口
2、調(diào)用實(shí)現(xiàn)了 Ordered 排序接口
3、沒有實(shí)現(xiàn)接口的調(diào)用
這個(gè)接口我的理解:獲取 BeanDefinitionRegistry 對象,獲取到這個(gè)對象就可以獲取這個(gè)對象中注冊的所有 BeanDefinition 對象,所以我們知道了,我們擁有這個(gè)對象就可以完成里面所有 BeanDefinition 對象的修改新增操作

BeanPostProcessor 的注冊
Refresh().registerBeanPostProcessors 這個(gè)方法里面。

拿到 BeanFactory 中所有注冊的 BeanDefinition 對象的名稱 beanName。

然后判斷是否實(shí)現(xiàn)了 PriorityOrdered 排序接口,Ordered 排序接口,getBean 是將該 ppName 對應(yīng)的 BeanDefinition 對象實(shí)例化。

把對應(yīng)的 BeanPostProcessor 對象注冊到 BeanFactory 中,BeanFactory 中有一個(gè)list 容器接收。getSingleton 方法代碼位置:AbstractBeanFactory.doGetBean 方法中

方法里面核心要點(diǎn):


把 beanName 添加到 singletonsCurrentlyInCreation Set 容器中,在這個(gè)集合里面的 bean 都是正在實(shí)例化的 bean,就是實(shí)例化還沒做完的 BeanName

調(diào)到 getObject 方法,完成 bean 的實(shí)例化。接下來

getObject 調(diào)用完后,就代表著 Bean 實(shí)例化已經(jīng)完成了,這時(shí)候就需要
1、singletonsCurrentlyInCreation 把 beanName 從這個(gè)集合中刪除
2、addSingleton,把 bean 緩存到一級緩存中
createBean
方法代碼位置:AbstractBeanFactory.doGetBean 方法中

這個(gè)方法是 bean 實(shí)例化核心方法

實(shí)例化方法,把 bean 實(shí)例化,并且包裝成 BeanWrapper點(diǎn)進(jìn)這個(gè)方法里面。

這個(gè)方法是反射調(diào)用類中的 factoryMethod 方法。這要知道@Bean 方法的原理,實(shí)際上spring 會掃描有@bean 注解的方法,然后把方法名稱設(shè)置到 BeanDefinition 的 factoryMethod屬性中,接下來就會調(diào)到上面截圖中的方法實(shí)現(xiàn)@Bean 方法的調(diào)用。該方法里面的參數(shù)解析過程不需要了解。

determineConstructorsFromBeanPostProcessors
這個(gè)方法是 BeanPostProcessor 接口類的首次應(yīng)用,最終會掉到AutowiredAnnotationBeanPostProcessor 類的方法,在方法中會掃描有注解的構(gòu)造函數(shù)然后完成裝配過程。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java?自定義注解在登錄驗(yàn)證的應(yīng)用示例
本文主要介紹了Java?自定義注解在登錄驗(yàn)證的應(yīng)用示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
詳解SpringBoot開發(fā)案例之整合Dubbo分布式服務(wù)
這篇文章主要介紹了詳解SpringBoot開發(fā)案例之整合Dubbo分布式服務(wù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10
Struts1和struts2的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Struts1和struts2的區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09

