Spring应用上下文启动准备阶段
- Abstract ApplicationContext#prepare Refresh() 方法
- 启动时间-startupDate
- 状态标识-closed(false) 、active(true)
- 初始化PropertySources-initPropertySources()
- 检验Environment中必须属性
- 初始化事件监听器集合
- 初始化早期Spring事件集合
BeanFactory创建阶段
- AbstractApplicationContext#obtainFreshBeanFactory() 方法
- 刷新Spring应用上下文底层BeanFactory-refreshBeanFactory()
- 销毁或关闭BeanFactory,如果已存在的话
- 创建BeanFactory-createBeanFactory()
- 设置BeanFactory ld
- 设置“是否允许BeanDefinition重复定义”-customizeBeanFactory(DefaultListableBeanFactory)
- 设置“是否允许循环引用(依赖) "-customizeBeanFactory(DefaultListableBeanFactory)
- 加载BeanDefinition-loadBeanDefinitions(DefaultListableBeanFactory) 方法
- 关联新建BeanFactory到Spring应用上下文
- 返回Spring应用上下文底层BeanFactory-getBeanFactory()
- 刷新Spring应用上下文底层BeanFactory-refreshBeanFactory()
BeanFactory准备阶段
- AbstractApplicationContext#prepareBeanFactory(ConfigurableListableBeanFactory) 方法
- 关联ClassLoader
- 设置Bean表达式处理器
- 添加PropertyEditorRegistrar实现-ResourceEditorRegistrar
- 添加Aware回调接口BeanPostProcessor实现-ApplicationContextAwareProcessor
- 忽略Aware回调接口作为依赖注入接口
- 注册ResolvableDependency对象-BeanFactory、ResourceLoader、ApplicationEventPublisher以及ApplicationContext
- 注册ApplicationListenerDetector对象
- 注册LoadTimeWeaverAwareProcessor对象
- 注册单例对象-Environment、Java System Properties以及OS环境变量
BeanFactory后置处理阶段
- AbstractApplicationContext#postProcessBeanFactory(ConfigurableListableBeanFactory) 方法
- 由子类覆盖该方法
- AbstractApplicationContext#invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory方法
- 调用BeanFactoryPostProcessor或BeanDefinitionRegistry后置处理方法
- 注册LoadTimeWeaverAwareProcessor对象
BeanFactory注册BeanPostProcessor阶段
- AbstractApplicationContext#registerBeanPostProcessors(ConfigurableListableBeanFactory) 方法
- 注册PriorityOrdered类型的BeanPostProcessor Beans
- 注册Ordered类型的BeanPostProcessor Beans
- 注册普通BeanPostProcessor Beans
- 注册MergedBeanDefintionPostProcessor Beans
- 注册ApplicationListenerDetector对象
初始化內建Bean:MessageSource
- AbstractApplicationContext#initMessageSource() 方法
- MessageSource内建依赖
初始化內建Bean:Spring事件广播器
- AbstractApplicationContext#initApplicationEventMulticaster() 方法
- ApplicationEventPublisher底层实现
Spring应用上下文刷新阶段
- AbstractApplicationContext#onRefresh() 方法
- 子类覆盖该方法
- org.springframework.web.context.support.AbstractRefreshableWebApplicationContext#onRefresh()
- org.springframework.web.context.support.GenericWebApplicationContext#onRefresh()
- org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext#onRefresh()
- org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#onRefresh()
- org.springframework.web.context.support.StaticWebApplicationContext#onRefresh()
- 子类覆盖该方法
Spring事件监听器注册阶段
- AbstractApplicationContext#registerListeners() 方法
- 添加当前应用上下文所关联的ApplicationListener对象(集合)
- 添加BeanFactory所注册ApplicationListenerBeans
- 广播早期Spring事件
BeanFactory初始化完成阶段
- AbstractApplicationContext#finishBeanFactoryInitialization(ConfigurableListableBeanFactory)方法
- BeanFactory关联ConversionServiceBean, 如果存在
- 添加StringValueResolver对象
- 依赖查找LoadTimeWeaverAware Bean
- BeanFactory临时ClassLoader置为null
- BeanFactory冻结配置
- BeanFactory初始化非延迟单例Beans
Spring应用上下刷新完成阶段
- AbstractApplicationContext#finishRefresh() 方法
- 清除ResourceLoader缓存-clearResourceCaches() @since 5.0
- 初始化LifecycleProcessor对象-initLifecycleProcessor()
- 调用LifecycleProcessor#onRefresh() 方法
- 发布Spring应用上下文已刷新事件-ContextRefreshedEvent
- 向MBeanServer托管Live Beans
Spring应用上下文启动阶段
- AbstractApplicationContext#start() 方法
- 启动LifecycleProcessor
- 依赖查找Lifecycle Beans
- 启动Lifecycle Beans
- 发布Spring应用上下文已启动事件-Context Started Event
- 启动LifecycleProcessor
Spring应用上下文停止阶段
- AbstractApplicationContext#stop() 方法
- 停止LifecycleProcessor
- 依赖查找Lifecycle Beans
- 停止Lifecycle Beans
- 发布Spring应用上下文已停止事件-ContextStoppedEvent
- 停止LifecycleProcessor
Spring应用上下文关闭阶段
- AbstractApplicationContext#close() 方法
- 状态标识:active(false) 、closed(true)
- Live Beans JMX撤销托管
- LiveBeansView.unregisterApplicationContext(ConfigurableApplicationContext)
- 发布Spring应用上下文已关闭事件-ContextClosedEvent
- 关闭LifecycleProcessor
- 依赖查找Lifecycle Beans
- 停止Lifecycle Beans
- 销毁Spring Beans
- 关闭BeanFactory
- 回调onClose()
- 注册Shutdown Hook线程(如果曾注册)
面试题
Spring应用上下文生命周期有哪些阶段?
答:
刷新阶段-ConfigurableApplicationContext#refresh()
启动阶段-ConfigurableApplicationContext#start()
停止阶段-ConfigurableApplicationContext#stop()
关闭阶段-ConfigurableApplicationContext#close()