在这一章节中, 我们主要来学习prepareRefresh()方法。这个函数主要就是环境准备,例如对系统属性及环境变量的初始化及验证。下面我们先来看一张时序图。(相关资源可到这里下载:http://pan.baidu.com/s/1sjSo9a9)
1. AbstractApplicationContext
在个类中,我们可以看我们需要的环境准备函数prepareRefresh()。这里有两个函数值得我们去留意,那就是留给子类覆盖和验证需要的属性文件是否都已经放入环境中。
protected void prepareRefresh() {
this.startupDate = System.currentTimeMillis();
this.closed.set(false);
this.active.set(true);
if (logger.isInfoEnabled()) {
logger.info("Refreshing " + this);
}
// Initialize any placeholder property sources in the context environment
//留给子类覆盖
<strong>initPropertySources()</strong>;
// Validate that all properties marked as required are resolvable
// see ConfigurablePropertyResolver#setRequiredProperties
//验证需要的属性文件是否已经放入环境中
<strong>getEnvironment().validateRequiredProperties()</strong>;
// Allow for the collection of early ApplicationEvents,
// to be published once the multicaster is available...
this.earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>();
}
对于上面给出的initPropertySource是提供给用户去扩展Spring的能力。用户可以根据自身的需求去重写initPropertySource方法。而validateRequiredProperties则是对属性进行验证。
2. 总结
Spring在加载前做的环境准备,主要是用prepareRefresh函数来实现。这里的实现突出了Spring的设计特点,允许用户去扩展自己想要的功能,这也是Spring框架的灵活性之一。更多的细节性代码,读者可以自己跟踪进出看看。