Spring应用上下文周期

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()

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

Spring应用上下文停止阶段

  • AbstractApplicationContext#stop() 方法
    • 停止LifecycleProcessor
      • 依赖查找Lifecycle Beans
      • 停止Lifecycle Beans
    • 发布Spring应用上下文已停止事件-ContextStoppedEvent

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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值