IOC的容器設計
主要兩條主線
BeanFactory
一條是以BeanFactory到HierarchicalBeanFactory再到ConfigurableBeanFactory。BeanFactory作為IOC容器的基本實現,譬如getBean() 可以從容器中拿到對應bean。而HierarchicalBeanFactory 則增加了getParentBeanFactory()可以獲取父級容器。ConfigurableBeanFactory定義了一些配置功能??偲饋砦覀兛梢园堰@條線定義為IOC容器的基本實現。
ApplicationContext
第二條是以ApplicationContext為核心的的接口設計。其下游接口ConfigurableApplicationContext 和 WebApplicationContext。相比BeanFactory則是IOC容器的更高級實現。
開發中,我們接觸最多的,應該就是ApplicationContext。
1.訪問資源多樣化支持file路徑、class路徑等
2.支持應用事件。 由于繼承了ApplicationEventPublisher,事件和生命周期的結合為Bean的管理提供了便利
3.提供很多的附加功能,使得IOC容器的功能更為豐富,相比BeanFactory它的使用是面向框架的風格。
ApplicationContext 的具體實現
以FileSystemXmlApplicationContext為例,ApplicationContext的具體實現大部分在FileSystemXmlApplicationContext的基類AbstractXmlApplicationContext中實現,我們看下使用姿勢
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("/"+"/code/spring-study/target/classes/applicationContext-test.xml");
context.getBean("helloWorldService");
具體執行的FileSystemXmlApplicationContext構造方法
public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
throws BeansException {
super(parent);
setConfigLocations(configLocations);
if (refresh) {
refresh();
}
}
其中核心部分就是 refresh()
,它承擔這IOC容器啟動的一系列操作,后續會逐步分析。
IOC容器啟動步驟
IOC容器,我們可以簡單的任務它就是一個水桶,而BeanDefinition就是里面的水。BeanDefinition包含了spring應用中各對象屬性以及對象間的相互依賴關系,看下圖,里面有些屬性大家都很熟悉了,就是我們在xml里定義的bean各種配置。
有了這些基礎數據,容器才能發揮作用。
IOC容器初始化順序大致分為下面三個部分,后續的代碼分析也是基于這三塊依次展開
1.Resource定位
這個主要是指BeanDefinition資源的定位,或者我們就簡單的認為我們的配置文件定位
2.BeanDefinition載入
將用戶定義好的bean信息轉化成BeanDefinition的形式,存儲到內存中
3.注冊BeanDefinition
向IOC容器注冊BeanDefinition
系列文章
spring源碼探索(0)-IOC容器-架構設計
spring源碼探索(1)-IOC容器-Resource
spring源碼探索(2)-IOC容器-BeanDefinition加載與注冊
spring源碼探索(3)-IOC容器-Bean的一生
spring源碼探索(4)-AOP實現原理