一 概述
prepareRefresh是抽象类AbstractApplicationContext中的方法,主要干了刷新前的准备工作,比如设置上下文的属性,配置文件的校验等。
如果开启debug模式,执行完prepareRefresh后会打印日志
DEBUG org.springframework.context.support.ClassPathXmlApplicationContext -Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2d901eb0
二 源码
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
//校验配置文件
//如果存在key为null会发抛出异常
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...
//初始化earlyApplicationEvents ,用于收集早期的应用事件
this.earlyApplicationEvents = new LinkedHashSet<>();
}
三 参考文献
1)JDK7在线文档
https://tool.oschina.net/apidocs/apidoc?api=jdk_7u4
2) JDK8在线文档
https://docs.oracle.com/javase/8/docs/api/
3) Bruce Eckel. Java编程思想,第4版,2007,机械工业出版社
4)方腾飞,魏鹏,程晓明. Java并发编程的艺术,第1版,2015年,机械工业出版社
5)克雷格.沃斯. Spring实战,第5版,2020年,人民邮电出版社