Spring应用上下文的生命周期
近期在回顾之前学习的Spring源码,扫地生简单记录一下Spring应用上下文的声明周期。
Spring应用上下文就是ApplicationContext,生命周期主要体现在org.springframework.context.support.AbstractApplicationContext#refresh()方法中,大致如下:
- Spring应用上下文启动准备阶段,设置相关属性,例如启动时间、状态标识、Environment对象。
- BeanFactory初始化阶段,初始化一个BeanFactory对象,加载出BeanDefinition们;设置相关组件,例如ClassLoader类加载器、表达式语言处理器、属性编辑器,并添加几个BeanPostProcessor处理器。
- BeanFactory后置处理阶段,主要是执行BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor的处理,对BeanFActory和BeanDefinitionRegistry进行后置处理,这里属于Spring应用上下文的一个扩展点。
- BeanFactory注册BeanPostProcessor阶段,主要初始化BeanPostProcessor类型的Bean(依赖查找),在Spring Bean生命周期的许多节点都能见到该类型的处理器。
- 初始化内建Bean阶段,初始化当前Spring应用上下文的MessageSource对象(国际化文案相关)、ApplicationEventMulticast而时间广播器对象,ThemeSource对象。
- Spring时间监听器注册阶段,主要获取到所有的ApplicationListener时间监听器进行注册,并广播早期事件。
- BeanFactory初始化完成阶段,主要是初始化所有还未初始化的Bean(不是抽象、单例模式、不是懒加载方式)。
- Spring应用上下文刷新完成阶段,清除当前Spring应用上下文中的缓存,例如通过ASM(java字节码操作和分析框架)。
- Spring 应用上下文启动阶段,需要主动调用 AbstractApplicationContext#start() 方法,会调用所有 Lifecycle 的 start() 方法,最后会发布上下文启动事件
- Spring 应用上下文停止阶段,需要主动调用 AbstractApplicationContext#stop() 方法,会调用所有 Lifecycle 的 stop() 方法,最后会发布上下文停止事件
- Spring 应用上下文关闭阶段,发布当前 Spring 应用上下文关闭事件,销毁所有的单例 Bean,关闭底层 BeanFactory 容器;注意这里会有一个钩子函数(Spring 向 JVM 注册的一个关闭当前 Spring 应用上下文的线程),当 JVM “关闭” 时,会触发这个线程的运行
小结:
上面的
1
、2
、3
、4
、5
、6
、7
、8
都属于 Sping 应用上下文的刷新阶段,完成了 Spring 应用上下文一系列的初始化工作;
9
属于 Spring 应用上下文启动阶段,和 Lifecycle 生命周期对象相关,会调用这些对象的 start() 方法,最后发布上下文启动事件;
10
属于 Spring 应用上下文停止阶段,和 Lifecycle 生命周期对象相关,会调用这些对象的 stop() 方法,最后发布上下文停止事件;
11
属于 Spring 应用上下文关闭阶段,发布上下文关闭事件,销毁所有的单例 Bean,关闭底层 BeanFactory 容器。