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应用上下文生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Spring(十六)--Spring应用上下文生命周期

Spring应用上下文中Bean的生命周期

Spring IOC容器生命周期阶段总结

spring学习-IOC-生命周期简介

spring学习-IOC-生命周期简介

Spring容器