Spring bean對(duì)象實(shí)例化實(shí)現(xiàn)過(guò)程圖解
好了 我們聊聊 Bean 的實(shí)例化過(guò)程的幾個(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 對(duì)象,獲取到這個(gè)對(duì)象就可以獲取這個(gè)對(duì)象中注冊(cè)的所有 BeanDefinition 對(duì)象,所以我們知道了,我們擁有這個(gè)對(duì)象就可以完成里面所有 BeanDefinition 對(duì)象的修改新增操作
BeanPostProcessor 的注冊(cè)
Refresh().registerBeanPostProcessors 這個(gè)方法里面。
拿到 BeanFactory 中所有注冊(cè)的 BeanDefinition 對(duì)象的名稱 beanName。
然后判斷是否實(shí)現(xiàn)了 PriorityOrdered 排序接口,Ordered 排序接口,getBean 是將該 ppName 對(duì)應(yīng)的 BeanDefinition 對(duì)象實(shí)例化。
把對(duì)應(yīng)的 BeanPostProcessor 對(duì)象注冊(cè)到 BeanFactory 中,BeanFactory 中有一個(gè)list 容器接收。getSingleton 方法代碼位置:AbstractBeanFactory.doGetBean 方法中
方法里面核心要點(diǎn):
把 beanName 添加到 singletonsCurrentlyInCreation Set 容器中,在這個(gè)集合里面的 bean 都是正在實(shí)例化的 bean,就是實(shí)例化還沒做完的 BeanName
調(diào)到 getObject 方法,完成 bean 的實(shí)例化。接下來(lái)
getObject 調(diào)用完后,就代表著 Bean 實(shí)例化已經(jīng)完成了,這時(shí)候就需要
1、singletonsCurrentlyInCreation 把 beanName 從這個(gè)集合中刪除
2、addSingleton,把 bean 緩存到一級(jí)緩存中
createBean
方法代碼位置:AbstractBeanFactory.doGetBean 方法中
這個(gè)方法是 bean 實(shí)例化核心方法
實(shí)例化方法,把 bean 實(shí)例化,并且包裝成 BeanWrapper點(diǎn)進(jìn)這個(gè)方法里面。
這個(gè)方法是反射調(diào)用類中的 factoryMethod 方法。這要知道@Bean 方法的原理,實(shí)際上spring 會(huì)掃描有@bean 注解的方法,然后把方法名稱設(shè)置到 BeanDefinition 的 factoryMethod屬性中,接下來(lái)就會(huì)調(diào)到上面截圖中的方法實(shí)現(xiàn)@Bean 方法的調(diào)用。該方法里面的參數(shù)解析過(guò)程不需要了解。
determineConstructorsFromBeanPostProcessors
這個(gè)方法是 BeanPostProcessor 接口類的首次應(yīng)用,最終會(huì)掉到AutowiredAnnotationBeanPostProcessor 類的方法,在方法中會(huì)掃描有注解的構(gòu)造函數(shù)然后完成裝配過(guò)程。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于Freemarker和xml實(shí)現(xiàn)Java導(dǎo)出word
這篇文章主要介紹了基于Freemarker和xml實(shí)現(xiàn)Java導(dǎo)出word,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04使用XSD校驗(yàn)Mybatis的SqlMapper配置文件的方法(2)
這篇文章主要介紹了使用XSD校驗(yàn)Mybatis的SqlMapper配置文件的方法(2)的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11Spring?Boot?集成?Swagger2構(gòu)建?API文檔
這篇文章主要介紹了Spring?Boot?集成?Swagger2構(gòu)建?API文檔,通過(guò)使用?Swagger,我們只需要按照它所給定的一系列規(guī)范去定義接口以及接口的相關(guān)信息,然后它就能幫我們自動(dòng)生成各種格式的接口文檔,方便前后端開發(fā)者進(jìn)行前后端聯(lián)調(diào),下文需要的朋友可以參考一下2022-03-03詳解mybatis #{}和${}的區(qū)別、傳參、基本語(yǔ)法
這篇文章主要介紹了mybatis #{}和${}的區(qū)別、傳參、基本語(yǔ)法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07SpringBoot從繁至簡(jiǎn)的框架基礎(chǔ)教程
Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開發(fā)過(guò)程。該框架使用了特定的方式來(lái)進(jìn)行配置,從而使開發(fā)人員不再需要定義樣板化的配置2022-10-10JAVA對(duì)象JSON數(shù)據(jù)互相轉(zhuǎn)換的四種常見情況
這篇文章主要介紹了JAVA對(duì)象JSON數(shù)據(jù)互相轉(zhuǎn)換的四種常見情況,需要的朋友可以參考下2014-04-04