![](http://static.javashuo.com/static/loading.gif)
這段代碼是 Spring 中編程式使用 IOC 容器,經過這四段簡單的代碼,咱們能夠初步判斷 IOC 容器的使用過程編程
- 獲取資源
- 獲取 BeanFactory
- 根據新建的 BeanFactory 建立一個BeanDefinitionReader對象,該Reader 對象爲資源的解析器
- 裝載資源
整個過程就分爲三個步驟:資源定位、裝載、註冊數據結構
- 資源定位:咱們通常用外部資源來描述 Bean 對象,因此在初始化 IOC 容器的第一步就是須要定位這個外部資源
- 裝載:裝載就是 BeanDefinition 的載入。BeanDefinitionReader 讀取、解析 Resource 資源,也就是將用戶定義的 Bean 表示成 IOC 容器的內部數據結構:BeanDefinition。在 IOC 容器內部維護着一個 BeanDefinition Map 的數據結構,在配置文件中每個 <bean> 都對應着一個BeanDefinition對象
- 註冊:向IOC容器註冊在第二步解析好的 BeanDefinition,這個過程是經過 BeanDefinitionRegistery 接口來實現的。在 IOC 容器內部實際上是將第二個過程解析獲得的 BeanDefinition 注入到一個 HashMap 容器中,IOC 容器就是經過這個 HashMap 來維護這些 BeanDefinition 的。
- 須要注意的一點是這個過程並無完成依賴注入,依賴註冊是發生在應用第一次調用
getBean()
向容器索要 Bean 時
- 固然咱們能夠經過設置預處理,即對某個 Bean 設置 lazyinit 屬性,那麼這個 Bean 的依賴注入就會在容器初始化的時候完成
reader.loadBeanDefinitions(resource)
纔是加載資源的真正實現編碼
- 從指定的 xml 文件加載 Bean Definition,這裏會先對 Resource 資源封裝成 EncodedResource
- 主要是爲了對 Resource 進行編碼,保證內容讀取的正確性
- 經過
resourcesCurrentlyBeingLoaded.get()
來獲取已經加載過的資源
- 而後將 encodedResource 加入其中,若是 resourcesCurrentlyBeingLoaded 中已經存在該資源,則拋出 BeanDefinitionStoreException 異常
- 完成後從 encodedResource 獲取封裝的 Resource 資源並從 Resource 中獲取相應的 InputStream ,最後將 InputStream 封裝爲 InputSource 調用
doLoadBeanDefinitions()
方法 doLoadBeanDefinitions()
爲從 xml 文件中加載 Bean Definition 的真正邏輯code
- 調用
doLoadDocument()
方法,根據 xml 文件獲取 Document 實例
- 根據獲取的 Document 實例註冊 Bean 信息
- 其實在
doLoadDocument()
方法內部還獲取了 xml 文件的驗證模式
- 調用
getValidationModeForResource()
獲取指定資源(xml)的驗證模式
![](http://static.javashuo.com/static/loading.gif)
因此 doLoadBeanDefinitions()
主要就是作了三件事情xml
- 調用
getValidationModeForResource()
獲取 xml 文件的驗證模式
- 調用
loadDocument()
根據 xml 文件獲取相應的 Document 實例。
- 調用
registerBeanDefinitions()
註冊 Bean 實例。