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的资源定位。


分享到:


相關文章: