refresh() -> prepareRefresh()
前戏,做容器刷新前的准备工作
- 设置容器的启动时间
- 设置活跃状态为true
- 设置关闭状态为false
- 获取Environment对象,并加载当前系统的属性值到Environment对象中
- 准备监听器和事件的集合对象,默认为空的集合
protected void prepareRefresh() {
// Switch to active.
// 设置容器启动的时间
this.startupDate = System.currentTimeMillis();
// 容器的关闭标志位
this.closed.set(false);
// 容器的激活标志位
this.active.set(true);
// 记录日志
if (logger.isDebugEnabled()) {
if (logger.isTraceEnabled()) {
logger.trace("Refreshing " + this);
}
else {
logger.debug("Refreshing " + getDisplayName());
}
}
// Initialize any placeholder property sources in the context environment.
// 留给子类覆盖,初始化属性资源
initPropertySources();
// Validate that all properties marked as required are resolvable:
// see ConfigurablePropertyResolver#setRequiredProperties
// 创建并获取环境对象,验证需要的属性文件是否都已经放入环境中
getEnvironment().validateRequiredProperties();
// Store pre-refresh ApplicationListeners...
// 判断刷新前的应用程序监听器集合是否为空,如果为空,则将监听器添加到此集合中
if (this.earlyApplicationListeners == null) {
this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
}
else {
// Reset local application listeners to pre-refresh state.
// 如果不等于空,则清空集合元素对象
this.applicationListeners.clear();
this.applicationListeners.addAll(this.earlyApplicationListeners);
}
// Allow for the collection of early ApplicationEvents,
// to be published once the multicaster is available...
// 创建刷新前的监听事件集合
this.earlyApplicationEvents = new LinkedHashSet<>();
}
initPropertySources()
可以进行一些必要的属性验证:如验证系统环境中是否存在USER
属性
import org.springframework.beans.BeansException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ArminClassPathApplicationContext extends ClassPathXmlApplicationContext {
public ArminClassPathApplicationContext(String... configLocations) throws BeansException {
super(configLocations);
}
@Override
protected void initPropertySources() {
super.initPropertySources();
System.out.println("扩展initPropertySources");
getEnvironment().setRequiredProperties("USER");
System.out.println(getEnvironment().getProperty("USER"));
}
}
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ArminClassPathApplicationContext("spring-${USER}.xml");
Person person = ac.getBean(Person.class);
System.out.println(person);
}
}
console out
扩展initPropertySources
armin
com.armin.Person@40a4337a
getEnvironment().validateRequiredProperties()
以上initPropertySources()中getEnvironment().setRequiredProperties(“USER”)设置的USER
会在此处进行校验,如同springboot中@Value("${USER}")
会进行配置中是否有USER
这个配置
applicationListeners
spring中该集合为空,该参数扩展使用,如springboot项目该集合长度一定大于零
// 判断刷新前的应用程序监听器集合是否为空,如果为空,则将监听器添加到此集合中
if (this.earlyApplicationListeners == null) {
this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
}
else {
// Reset local application listeners to pre-refresh state.
// 如果不等于空,则清空集合元素对象
this.applicationListeners.clear();
this.applicationListeners.addAll(this.earlyApplicationListeners);
}