Spring IOC 之 加載 Bean

這段代碼是 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)的驗證模式

因此 doLoadBeanDefinitions()主要就是作了三件事情xml

  1. 調用 getValidationModeForResource() 獲取 xml 文件的驗證模式
  2. 調用 loadDocument() 根據 xml 文件獲取相應的 Document 實例。
  3. 調用 registerBeanDefinitions() 註冊 Bean 實例。
相關文章
相關標籤/搜索