以上幾篇文章已經詳細介紹了IoC容器的初始化過程,本文來對這個過程做個總結。
Spring IoC容器的初始化過程主要包括以下幾個步驟:
- 擷取Resouce執行個體。加載XML配置檔案,封裝成Resouce執行個體。這時Resouce執行個體中已經有了配置檔案的路徑等資訊。
- 擷取Document執行個體。通過Resource,讀取XML配置檔案,封裝成Document執行個體。這時Document執行個體中已經有了配置檔案中的标簽。
- 擷取BeanDefinition執行個體。解析Document執行個體中的标簽,最終獲得BeanDefinition執行個體。這時BeanDefinition執行個體中已經有了bean的id、name、alias、class等資訊。
- 注冊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容器初始化時就預先完成了。