Spring源碼分析-IOC容器ApplicationContext的設計原理

在ApplicationContext容器中,我們以常用的FileSystemXmlApplicationContext的實現為例來說明ApplicationContext容器的設計原理。

在FileSystemXmlApplicationContext的設計中,我們看到ApplicationContext應用上下文的主要功能已經在FileSystemXmlApplicationContext的基類AbstractXmlApplicationContext中實現了,在FileSystemXmlApplicationContext中作為一個具體的應用上下文,只需要實現和它自身設計相關的兩個功能。

一個功能是,如果應用直接使用FileSystemXmlApplicationContext,對於實例化這個應用上下文的支持,同時啟動IOC容器的refresh()過程。這在FileSystemXmlApplicationContext的代碼中實現中可以看到,代碼如下:

public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)

throws BeansException {

super(parent);

setConfigLocations(configLocations);

if (refresh) {

refresh();

}

}

這個refresh()過程會牽涉IOC容器啟動的一系列複雜操作,同時,對於不同的容器實現,這些操作都是類似的,因此在基類中將他們封裝好。所以,我們在FileSystemXmlApplicationContext設計中看到的只是一個簡單的調用。關於這個refresh()在IOC容器啟動時的具體實現,是後面要分析的主要內容,這裡就不詳細展開了。

另一個功能是與FileSystemXmlApplicationContext設計具體相關的功能,這部分與怎樣從文件系統中加載XML的Bean定義資源有關。

通過這個過程,可以為在文件系統中讀取以XML形式存在的BeanDefinition做準備,因為不同的應用上下文實現 對應著不同的讀取BeanDeifintion的方式,在FileSystemXmlApplicationContext中的實現代碼如下:

protected Resource getResourceByPath(String path) {

if (path != null && path.startsWith("/")) {

path = path.substring(1);

}

return new FileSystemResource(path);

}

可以看到,調用這個方法,可以得到FileSystemResouce的資源定位。


分享到:


相關文章: