Spring BeanDefinition 生成所有bean的配置信息

參考
https://blog.csdn.net/jzq114/article/details/50831499

配置文件轉變?yōu)?BeanDefinition


這個過程會記錄下所有的bean定義,這只是定義,還沒生成具體的bean。

參考 https://blog.csdn.net/jzq114/article/details/50814266

Map<String, RootBeanDefinition> mergedBeanDefinitions。
為了不至于每次用到配置信息的時候都去解析一遍配置文件,我們需要將解析結果保存起來。而保存解析結果這個過程就是BeanDefinition的注冊。

生成BeanDefinition過程


參考 https://blog.csdn.net/jzq114/article/details/50761201

image.png

順著obtainFreshBeanFactory方法,進入到AbstractRefreshableApplicationContext的refreshBeanFactory方法,這個方法的主要功能就是創(chuàng)建默認的IOC容器和Xml配置文件的相關操作。

image.png
  • 真正加載地方
    AbstractBeanDefinitionReader.loadBeanDefinitions()
image.png

執(zhí)行完,bean定義信息就加載完成了,后面就根據(jù)這些定義信息生成bean。


image.png

注解和xml配置文件的理解


容器啟動時,先讀取配置文件,如果發(fā)現(xiàn)配置文件里設置了掃描注解,則掃描注解生成每個bean的BeanDefinition放入BeanDefinition 容器。再繼續(xù)讀取xml,將配置的bean放入到BeanDefinition 容器中,這樣bean定義容器就有了所有的BeanDefinition。
下一步就根據(jù)這些bean定義生成bean對象,并注入依賴的bean,如果依賴的bean沒有,則繼續(xù)生成,這樣遞歸下去,知道所有的bean都生成結束。

spring IOC啟動過程


構造一個IOC容器需要如下幾個步驟:
第一步:資源的定位。所謂資源就是指Spring里眾多的XML配置文件,要獲取到配置文件里面的信息,首先是要找到它。
第二步:加載和解析資源文件。XML文件里面定義的一些節(jié)點,和Spring里面定義的數(shù)據(jù)結構不匹配,那么就需要按照Spring的解析規(guī)則將XML解析成Spring需要的。
第三步:將解析完的數(shù)據(jù)結構注冊到IOC容器中。Spring中內部的數(shù)據(jù)結構叫BeanDefinition。
經過以上三個步驟之后,IOC容器已經構造好,但是還是不能被直接使用。BeanDefinition只是配置文件里的配置在IOC中建立的一個映射,對于IOC容器來說最重要的依賴關系都還沒有注入呢,相當于光有一個殼,內容還沒有填充。
這里又有個Spring中重要的概念,叫做依賴注入。依賴的意思上文中有提到過吧,就是對象的引用關系嘛,注入是個動詞,個人理解為設置,那依賴注入的意思不就是設置對象的引用關系了哇。
接下來這個過程是容器的實例化。容器的實例化只有一步,就是依賴注入。
完成IOC容器的構造和實例化之后,完整的IOC就建立好了。主線分析好了,接下來便可以順藤摸瓜的學習源碼了。

依賴注入


依賴注入主要有兩個過程,一個是實例化Bean,另一個是將依賴關系注入到Bean中。
依賴注入的入口是我們熟悉的getBean方法。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容