javascript
Spring IoC(二)IoC容器的初始化过程
(一)IoC 容器初始化過程概述
1.1簡要概述初始化過程
IoC 容器的初始化過程是通過refresh() 方法來啟動的,這個方法標識著IoC 容器正式啟動。具體來說,這個啟動過程包括:BeanDefinition 的Resource 定位、載入和注冊三個基本過程。
Spring 把這三個過程分開,并使用不同的模塊來完成,通過這樣的設計方式,可以讓用戶更加靈活的對這三個過程進行裁剪或擴展,從而方便自己定義IoC 容器的初始化過程。
第一個過程是Resource 的定位過程。這個Resource 的定位指的是BeanDefinition 的資源定位,它由ResourceLoader 通過統一的Resource 接口來完成。對于BeanDefinition 的存在形式,可以是文件系統中的,通過FileSystemResource 來進行抽象;類路徑中定義的Bean 信息可以通過ClassPathResource 來進行抽象。等等。這個過程可以理解為IoC 容器尋找數據的過程。
第二個過程是BeanDefinition 的載入。這個載入過程是把用戶定義好的Bean 定義成IoC 容器內部的數據結構,而這個容器內部數據結構就是BeanDefinition。具體來說,這個BeanDefinition 實際上就是POJO 對象在IoC 容器中的抽象,通過這個BeanDefinition 定義的數據結構,使IoC 容器能夠方便地管理Bean。
第三個過程是向IoC 容器中注冊這些BeanDefinition 的過程。這個過程是通過BeanDefinitionRegistry 接口的實現來完成的。這個注冊過程把載入過程中解析得到的BeanDefinition 向IoC 容器進行注冊。在IoC 容器內部將BeanDefinition 注入到一個HashMap 中去,IoC 容器就是通過這個HashMap 來持有這些Bean 數據的。
這里談的IoC 容器的初始化過程,并不包含Bean 依賴注入的實現。在Spring IoC 的設計中,Bean 定義的載入和依賴注入是兩個獨立的過程。依賴注入一般發生在第一個通過getBean() 向容器中獲取Bean 的時候。但是也并不全是這樣,比如我們對某個Bean 設置了lazyinit 屬性,那么Bean 的依賴注入在其初始化的過程中就已經完成了。
(二)IoC 容器具體初始化過程解析
2.1BeanDefinition 的Resource 定位
ApplicationContext 是一個接口,其實現類主要有:FileSystemXmlApplicationContext、
ClassPathXmlApplicationContext 和XmlWebApplicationContext 等。從這些類的名字就可以分析的出其加載文件的位置。FileSystemXmlApplicationContext 可以從文件系統中載入Resource、ClassPathXmlApplicationContext 可以從類路徑下載入Resource、XmlWebApplicationContext 可以從Web 容器中載入Resource。
這里以FileSystemXmlApplicationContext 為例,來分析ApplicationContext 的實現是如何完成Resource 定位的,下面是這個類對應的繼承體系。
下面是更為詳細的繼承體系。
從上圖中可以看出FileSystemXmlApplicationContext 已經通過繼承AbstractApplicationContext 具備了ResourceLoader 的功能,因為AbstractApplicationContext 繼承自DefaultResourceLoader。下面是其源代碼:
對BeanDefinition 資源定位的過程,最初是由refresh() 方法觸發的,refresh() 方法的調用是在
FileSystemXmlApplicationContext 的構造函數中啟動的。getResourceByPath() 方法的調用過程主要如下:
從上面的源代碼中可以看出,只要是以XML 文件方式存在的BeanDefinition 都能夠得到有效的處理。上面的源代碼中并沒有涉及到BeanDefinition 的信息讀入,那么FileSystemXmlApplicationContext 是怎么完成信息的讀入的呢?
上面已經提到過BeanDefinition 資源的定位、載入和注冊過程都是分開進行的。關于這個讀入器的配置,可以在FileSystemXmlApplicationContext 的基類AbstractRefreshableApplicationContext 中查看。
這里主要看AbstractRefreshableApplicationContext 中的refreshBeanFactory() 方法的實現,
這個方法被FileSystemXmlApplicationContext 構造函數中的refresh() 方法所調用。在refreshBeanFactory()這個方法中,通過createBeanFactory() 創建一個IoC 容器供AppliCationContext 使用。這個IoC 容器就是上一篇博文中提到的DefaultListableBeanFactory。同時,還啟動了loadBeanDefinitions() 來載入BeanDefinition。下面是refreshBeanFactory() 的方法的源碼:
在BeanDefinition 定位完成的基礎上,就可以通過返回的Resource 對象來進行BeanDefinition 的載入了。在完成定位過程后,為BeanDefinition 的載入創造了I/O 操作的條件,但是具體的數據還沒有開始讀入。
2.2BeanDefinition 的載入和解析
先發出來,慢慢更!
總結
以上是生活随笔為你收集整理的Spring IoC(二)IoC容器的初始化过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 车险哪些必须买
- 下一篇: 货币市场包括哪些市场