Spring应用上下文生命周期整体分成四个阶段
- ConfigurableApplicationContext#refresh,加载或者刷新持久化配置
- ConfigurableApplicationContext#start,启动应用上下文
- ConfigurableApplicationContext#stop,停止应用上下文
- ConfigurableApplicationContext#close,关闭应用上下文,释放锁定资源
实际上refresh执行完成后Spring应用上下文从广义上来说已经启动了,start回调用LifeCycleProcessors的start方法,可以理解refresh处理Spring应用上下文启动需要的东西,start相当于是一个扩展,close和stop是和refresh和close类似的逆向操作。
因此Spring应用上下文生命周期重头戏是refresh和close两个方法对应的实现。
refresh-刷新应用上下文
整个refresh阶段代码如下所示:


从代码可以看出,refresh整体分为以下几个阶段:
- 准备刷新阶段: prepareRefresh
- BeanFactory创建阶段: obtainFreshBeanFactory
- BeanFactory准备阶段: prepareBeanFactory
- BeanFactory后置处理阶段: postProcessBeanFactory、invokeBeanFactoryPostProcessors
- BeanFactory注册BeanPostProcessor阶段: registerBeanPostProcessors
- 初始化内建Bean: initMessageSource、initApplicationEventMulticaster
- Spring应用上下文刷新阶段: onRefresh
- Spring事件监听器注册阶段: registerListener
- BeanFactory初始化完成阶段: finishBeanFactoryInitialization
- Spring应用上下文刷新完成阶段: finishRefresh
准备刷新阶段
prepareRefresh方法注释如下所示,可以看出,这个方法主要做了三件事来准备上下文刷新:
- 设置启动时间
- 设置激活标
- 执行任何初始化属性来源

protected void prepareRefresh() {
//设置启动时间、激活标
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());
}
}
//初始化属性源,扩展用
initPropertySources();
//校验必要属性
getEnvironment().validateRequiredProperties();
//创建存储早期applicationListeners容器
if (this.earlyApplicationListeners == null) {
this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
}
else {
this.applicationListeners.clear();
this.applicationListeners.addAll(this.earlyApplicationListeners);
}
//创建存储早期applicationEvents容器,存储早期Spring Application事件,用于后面applicationEventMulticaster发布事件用
this.earlyApplicationEvents = new LinkedHashSet<>();
}
BeanFactory创建阶段
在
AbstractRefreshableApplicationContext的refreshBeanFactory实现里,会对这个应用上下文的底层BeanFactory做一个刷新,如果之前有BeanFactory,会先停止,再初始化一个新的BeanFactory

本文详细阐述了Spring应用上下文的生命周期,包括refresh、start、stop和close四个阶段。重点解析了refresh过程,该过程涉及BeanFactory的创建、准备、后置处理、BeanPostProcessor的注册以及内建Bean的初始化等步骤,为Spring应用上下文的启动做好准备。
最低0.47元/天 解锁文章
2567

被折叠的 条评论
为什么被折叠?



