Spring(十六)--Spring应用上下文生命周期
Posted jazon@
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring(十六)--Spring应用上下文生命周期相关的知识,希望对你有一定的参考价值。
Spring应用上下文启动准备阶段
- AbstractApplicationContext#prepareRefresh()方法
1.启动时间startupDate
2.状态标识closed、active
3.初始化PropertySources-initPropertySources()
4.检验Environment中必须属性
5.初始化事件监听器集合
6.初始化早期Spring事件集合
BeanFactory创建阶段
- AbstarctApplicationContext#obtainFreshBeanFactory()方法
1.刷新Spring应用上下文底层BeanFactory-refreshBeanFactory()
- 销毁或关闭BeanFactory,如果已存在的话
- 设置BeanFactory-createBeanFactory
- 设置BeanFactoryId
- 设置是否允许BeanDefinition重复定义-customizeBeanFactory(DefaultListableBeanFactory)
- 设置是否允许循环引用-customizeBeanFactory(DefaultListableBeanFactory)
- 加载BeanDefinition-loadBeanDefinitions(DefaultListableBeanFactory)方法
- 关联新增BeanFactory到Spring应用上下文
2.返回Spring应用上下文底层BeanFactory-getBeanFactory()
BeanFactory准备阶段
- AbstractApplicationContext#prepareBeanFactory(ConfigurableListableBeanFactory)方法
1.关联ClassLoader
2.设置Bean表达式处理器
3.添加PropertyEditorRegistrar实现–ResourceEditorRegistrar
4.添加Ware回调接口BeanPostProcessor实现–ApplicationContextAwareProcessor
5.忽略Aware回调接口作为依赖注入接口
6.注册ResolvableDependency对象
7.注册单例对象-Environment、JavaSystemProperties以及OS环境变量
BeanFactory后置处理阶段
- AbstractApplicationContext#postProcessBeanFactory(ConfigurableListableBeanFactory)方法,由子类覆盖该方法。
- AbstractApplicationContext#invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory)方法
1.调用BeanFactoryPostProcessor或BeanDefinitionRegistry后置处理方法
BeanFactory注册BeanPostProcessor阶段
注册所有BeanPostProcessor,即调用beanFactory.getBean(String name, Class<?> requiredType)方法获取(没有则会创建)到所有BeanPostProcessor实例,加入到集合中。
初始化内建Bean:MessageSource
- AbstractApplicationContext#initMessageSource()方法
初始化内建Bean:Spring事件广播器
- AbstractApplicationContext#initApplicationEventMulticaster()方法
Spring应用上下文刷新阶段
- AbstractApplicationContext#onRefresh()方法,由子类覆盖此方法。
Spring事件监听器注册阶段
- AbstractApplicationContext#registerListeners()方法
1.添加当前应用上下文所关联的ApplicationListener对象
2.添加BeanFactory所注册ApplicationListenerBeans
3.广播早期Spring事件
BeanFactory初始化完成阶段
- AbstractApplicationContext#finishBeanFactoryInitialization(ConfigurableListableBeanFactory)方法
1.BeanFactory关联ConversionService Bean
2.添加StringValueResolver对象
// Register a default embedded value resolver if no bean post-processor
// (such as a PropertyPlaceholderConfigurer bean) registered any before:
// at this point, primarily for resolution in annotation attribute values.
if (!beanFactory.hasEmbeddedValueResolver()) {
beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
}
3.依赖查找LoadTimeWeaverAwareBean
4.BeanFactory临时ClassLoader置为null
5.BeanFactory冻结配置
6.BeanFactory初始化非延迟单例Beans
Spring应用上下刷新完成阶段
- AbstractApplicationContext#finishRefresh()方法
1.清除ResourceLoader缓存
2.初始化LifecycleProcessor对象
3.调用LifecycleProcessor#onRefresh()方法
4.发布Spring应用上下文已刷新事件-ContextRefreshedEvent
5.向MBeanServer托管LiveBeans
Spring应用上下文启动阶段
- AbstractApplicationContext#start()方法
1.启动LifecycleProcessor: 1.依赖查找LifecycleBeans。2.启动LifecycleBeans
- 发布Spring应用上下文已启动事件-ContextStartedEvent
Spring应用上下文停止阶段
- AbstractApplicationContext#stop()方法
1.停止LifecycleProcessor: 1.依赖查找Lifecycle Beans。2.停止LifecycleBeans
- 发送Spring应用上下文已停止事件
Spring应用上下文关闭阶段
- AbstractApplicationContext#close()方法
1.状态标识: active(false)、closed(true)
2.LiveBeansJMX撤销托管
3.发布Spring应用上下文已关闭事件-ContextClosedEvent
4.关闭LifecycleProcessor: 1.依赖查找LifecycBeans。2.停止LifecycleBeans
5.销毁SpringBeans
6.关闭BeanFactory
7.回调onClose()
8.注册ShutdownHook线程
以上是关于Spring(十六)--Spring应用上下文生命周期的主要内容,如果未能解决你的问题,请参考以下文章