上一篇我们一起学习了【spring】FileSystemXmlApplicationContext 类学习
AbstractApplicationContext 的refresh() 方法介绍
AbstractApplicationContext
的refresh()
方法仍然是整个Spring应用程序上下文初始化的核心流程入口。大体上的刷新生命周期依然保持一致。
refresh()
方法的执行流程是一个复杂的过程,它涉及到多个方法的调用和多个步骤的执行。在实际开发中,我们通常不需要直接调用 refresh()
方法,而是通过调用 AbstractApplicationContext
类的子类的 refresh()
方法来刷新应用上下文。
源码截图
注释后的源码
public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// 调用容器准备刷新,获取容器的当前时间,同时给容器设置同步标识prepareRefresh();// 告诉子类启动 refreshBeanFactory() 方法,BeanDefinition 资源文件的载入从子类的 refreshBeanFactory() 方法启动开始ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// 为 BeanFactory 配置容器特性,例如类加载器、事件处理器等prepareBeanFactory(beanFactory);try {// 为容器的某些子类指定特殊的 BeanPost 事件处理器postProcessBeanFactory(beanFactory);// 调用所有注册的 BeanFactoryPostProcessor 的 BeaninvokeBeanFactoryPostProcessors(beanFactory);// 为 BeanFactory 注册 BeanPost 事件处理器.// BeanPostProcessor 是 Bean 后置处理器,用于监听容器触发的事件registerBeanPostProcessors(beanFactory);// 初始化信息源,和国际化相关.initMessageSource();// 初始化容器事件传播器initApplicationEventMulticaster();// 调用子类的某些特殊 Bean 初始化方法onRefresh();// 为事件传播器注册事件监听器.registerListeners();// 初始化 Bean,并对 lazy-init 属性进行处理finishBeanFactoryInitialization(beanFactory);// 初始化容器的生命周期事件处理器,并发布容器的生命周期事件finishRefresh();}catch (BeansException ex) {// 销毁以创建的单态 BeandestroyBeans();// 取消 refresh 操作,重置容器的同步标识.cancelRefresh(ex);throw ex;}}
}
对上面代码的解释
-
prepareRefresh()
:做一些刷新前的准备工作,例如设置启动时间戳等。 -
obtainFreshBeanFactory()
:获取或创建一个新的ConfigurableListableBeanFactory
,它是Spring容器的基础,用于存储和管理Bean的定义与实例。 -
prepareBeanFactory(beanFactory)
:对BeanFactory进行必要的配置,包括设置默认属性、添加系统属性以及设置类加载器等。 -
postProcessBeanFactory(beanFactory)
:允许子类对BeanFactory进行额外的后期处理。 -
invokeBeanFactoryPostProcessors(beanFactory)
:调用BeanFactory后处理器,它们可以修改BeanDefinition对象,影响容器内Bean的定义和初始化。 -
registerBeanPostProcessors(beanFactory)
:注册Bean后处理器,这些处理器可以在Bean实例化前后进行拦截处理。 -
initMessageSource()
和initApplicationEventMulticaster()
:分别初始化国际化消息源和应用事件广播器。 -
onRefresh()
:提供给子类覆盖,以便在刷新过程中执行特定的初始化动作。 -
registerListeners()
:注册监听器,这些监听器会在容器中监听特定的事件。 -
finishBeanFactoryInitialization(beanFactory)
:完成剩余所有非懒加载的单例Bean的初始化工作。 -
finishRefresh()
:刷新过程的最后阶段,发布一个ContextRefreshedEvent
事件,表示ApplicationContext已完成刷新,并且所有Bean都已准备好使用。