配置文件轉變?yōu)?BeanDefinition
這個過程會記錄下所有的bean定義,這只是定義,還沒生成具體的bean。
Map<String, RootBeanDefinition> mergedBeanDefinitions。
為了不至于每次用到配置信息的時候都去解析一遍配置文件,我們需要將解析結果保存起來。而保存解析結果這個過程就是BeanDefinition的注冊。
生成BeanDefinition過程

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

- 真正加載地方
AbstractBeanDefinitionReader.loadBeanDefinitions()

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

注解和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方法。