在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的资源定位。
閱讀更多 JAVA開發小助手 的文章