天天看點

(一)Spring IoC源碼-1.容器的初始化-07總結

以上幾篇文章已經詳細介紹了IoC容器的初始化過程,本文來對這個過程做個總結。

Spring IoC容器的初始化過程主要包括以下幾個步驟:

  1. 擷取Resouce執行個體。加載XML配置檔案,封裝成Resouce執行個體。這時Resouce執行個體中已經有了配置檔案的路徑等資訊。
  2. 擷取Document執行個體。通過Resource,讀取XML配置檔案,封裝成Document執行個體。這時Document執行個體中已經有了配置檔案中的标簽。
  3. 擷取BeanDefinition執行個體。解析Document執行個體中的标簽,最終獲得BeanDefinition執行個體。這時BeanDefinition執行個體中已經有了bean的id、name、alias、class等資訊。
  4. 注冊BeanDefinition。這個注冊過程把BeanDefinition向IOC容器進行注冊,相當于将bean的name作為key,BeanDefinition作為value,放入一個map中。

1.擷取Resouce執行個體

這個過程可以看做是定位XML配置檔案。Resource接口抽象了所有Spring内部使用的底層側緣:File、URL、ClassPath等等。對于不同的資源檔案都有對應的實作:FileSystemResource、ClassPathResource、UrlResource、InputStreamResource、ByteArrayResource等等。

2.擷取Document執行個體

這個過程是通過上一個步驟中擷取到的Resource執行個體中的配置檔案資訊,比如配置檔案路徑等資訊,讀取XML配置檔案,封裝成Document執行個體。這時Document執行個體中已經有了XML配置檔案中的标簽,通過

Element root = doc.getDocumentElement();

就可以擷取到配置檔案中的元素資訊。

3. 擷取BeanDefinition執行個體

這個過程是把使用者定義好的Bean表示成IOC容器内部的資料結構,而這個容器内部資料結構就是BeanDefinition。BeanDefinition實際上就是POJO對象在IOC容器中的抽象,通過對BeanDefinition定義的資料結構,使IOC容器能夠友善地對POJO對象進行管理。

4. 注冊BeanDefinition

這個過程是向IOC容器注冊BeanDefinition的過程。這個過程把載入過程中解析得到的BeanDefinition向IOC容器進行注冊,相當于将bean的name作為key,BeanDefinition作為value,放入一個map中。

IOC容器初始化過程一般不包含Bean加載的實作。Bean加載一般發生在應用第一次通過getBean向容器索取Bean的時候。但有一個例外:如果在XML檔案中為Bean定義了lazy-init屬性,那麼Bean的加載在IOC容器初始化時就預先完成了。

繼續閱讀