此篇文章爲Spring5源碼分析——IOC容器的初始化的最後一篇,這一篇主要是對IOC容器的初始化進行總結。html
經過上面的幾篇文章咱們完成了對FileSystemXmlApplicationContext IOC容器建立的分析,接下來總結一下IOC容器初始化的基本步驟。
1. 初始化的入口在容器實現中的 refresh()調用來完成。
2. 對 bean 定義載入 IOC 容器使用的方法是loadBeanDefinition,其中的大體過程以下:經過ResourceLoader來完成資源文件位置的定位,DefaultResourceLoader是默認的實現,同時上下文自己就給出了 ResourceLoader 的實現,能夠從類路徑,文件系統,URL 等方式來定爲資源位置。若是是 XmlBeanFactory 做爲 IOC 容器,那麼須要爲它指定 bean 定義的資源,也就是說bean定義文件時經過抽象成Resource來被IOC容器處理的,容器經過BeanDefinitionReader來完成定義信息的解析和Bean 信息的註冊 , 每每使用的是XmlBeanDefinitionReader來解析bean的xml定義文件-實際的處理過程是委託給BeanDefinitionParserDelegate來完成的,從而獲得 bean 的定義信息,這些信息在Spring中使用BeanDefinition對象來表示這個名字可讓咱們想到loadBeanDefinition,RegisterBeanDefinition這些相關方法-他們都是爲處理 BeanDefinitin 服務的,容器解析獲得BeanDefinition之後,須要把它在IOC容器中註冊,這由IOC實現BeanDefinitionRegistry接口來實現。註冊過程就是在 IOC 容器內部維護的一個 HashMap 來保存獲得的 BeanDefinition 的過程。這個 HashMap 是 IOC 容器持有 Bean 信息的場所,之後對 Bean 的操做都是圍繞這個 HashMap 來實現的。 web
而後咱們就能夠經過BeanFactory和ApplicationContext來享受到SpringIOC的服務了,在使用IOC容器的時候,咱們注意到除了少許粘合代碼,絕大多數以正確IOC 風格編寫的應用程序代碼徹底不用關心如何到達工廠,由於容器將把這些對象與容器管理的其餘對象鉤在一塊兒。基本的策略是把工廠放
到已知的地方,最好是放在對預期使用的上下文有意義的地方,以及代碼將實際須要訪問工廠的地方。Spring自己提供了對聲明式載入web應用程序用法的應用程序上下文,並將其存儲在ServletContext中的框架實現。spring
如下是容器初始化全過程的時序圖:
編程
在使用Spring IOC 容器的時候咱們還須要區別兩個概念:
BeanFactory 和 FactoryBean , 其中BeanFactory指的是IOC容器的編程抽象,好比ApplicationContext,XmlBeanFactory等,這些都是IOC容器的具體表現,須要使用什麼樣的容器由客戶決定,但 Spring爲咱們提供了豐富的選擇。FactoryBean只是一個能夠在IOC而容器中被管理的一個Bean,是對各類處理過程和資源使用的抽象,FactoryBean 在須要時產生另外一個對象,而不返回FactoryBean自己,咱們能夠把它當作是一個抽象工廠,對它的調用返回的是工廠生產的產品。全部的
FactoryBean 都實現特殊的 org.springframework.beans.factory.FactoryBean 接口,當使用容器中 FactoryBean 的時候,該容器不會返回 FactoryBean 自己,而是返回其生成的對象。Spring 包括了大部分的通用資源和服務訪問抽象的 FactoryBean 的實現,其中包括:對 JNDI 查詢的處理,對代理
對象的處理,對事務性代理的處理,對 RMI 代理的處理等,這些咱們均可以當作是具體的工廠,當作是Spring 爲咱們創建好的工廠。也就是說 Spring 經過使用抽象工廠模式爲咱們準備了一系列工廠來生產一些特定的對象,免除咱們手工重複的工做,咱們要使用時只須要在 IOC 容器裏配置好就能很方便的使
用了。 框架
更多文章請查看個人專欄 Spring5.0源碼學習源碼分析
須要原圖請留言。學習
文檔有參考其餘資料,若是問題請聯繫我,進行刪除!.net