SPRING TUTORIAL SPRING TUTORIAL
Spring综合
Spring核心
Spring数据
SpringIO
Spring集成
Spring其他
GitHub (opens new window)
Spring综合
Spring核心
Spring数据
SpringIO
Spring集成
Spring其他
GitHub (opens new window)
  • 框架

    • Spring

      • Spring综合

      • Spring核心

        • Spring Bean
        • Spring IoC
        • Spring 依赖查找
        • Spring 依赖注入
        • Spring IoC 依赖来源
        • Spring Bean 作用域
        • Spring Bean 生命周期
        • Spring 配置元数据
        • Spring 应用上下文生命周期
          • Spring 应用上下文启动准备阶段
          • BeanFactory 创建阶段
          • BeanFactory 准备阶段
          • BeanFactory 后置处理阶段
          • BeanFactory 注册 BeanPostProcessor 阶段
          • 初始化內建 Bean:MessageSource
          • 初始化內建 Bean:Spring 事件广播器
          • Spring 应用上下文刷新阶段
          • Spring 事件监听器注册阶段
          • BeanFactory 初始化完成阶段
          • Spring 应用上下刷新完成阶段
          • Spring 应用上下文启动阶段
          • Spring 应用上下文停止阶段
          • Spring 应用上下文关闭阶段
          • 问题
          • 参考资料
        • Spring AOP
        • Spring 资源管理
        • Spring 校验
        • Spring 数据绑定
        • Spring 类型转换
        • Spring EL 表达式
        • Spring 事件
        • Spring 国际化
        • Spring 泛型处理
        • Spring 注解
        • Spring Environment 抽象
        • SpringBoot 之快速入门
        • SpringBoot 之属性加载详解
        • SpringBoot 之 Profile
      • Spring数据

      • SpringWeb

      • SpringIO

      • Spring集成

      • Spring安全

      • Spring其他

  • Java
  • 框架
  • Spring
  • Spring核心
dunwu
2022-12-23
目录

Spring 应用上下文生命周期

# Spring 应用上下文生命周期

# Spring 应用上下文启动准备阶段

AbstractApplicationContext#prepareRefresh() 方法

  • 启动时间 - startupDate
  • 状态标识 - closed(false)、active(true)
  • 初始化 PropertySources - initPropertySources()
  • 检验 Environment 中必须属性
  • 初始化事件监听器集合
  • 初始化早期 Spring 事件集合

# BeanFactory 创建阶段

AbstractApplicationContext#obtainFreshBeanFactory() 方法

  • 刷新 Spring 应用上下文底层 BeanFactory - refreshBeanFactory()
    • 销毁或关闭 BeanFactory,如果已存在的话
    • 创建 BeanFactory - createBeanFactory()
    • 设置 BeanFactory Id
    • 设置“是否允许 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
  • 注册 MergedBeanDefinitionPostProcessor Beans
  • 注册 ApplicationListenerDetector 对象

# 初始化內建 Bean:MessageSource

AbstractApplicationContext#initMessageSource() 方法

# 初始化內建 Bean:Spring 事件广播器

AbstractApplicationContext#initApplicationEventMulticaster() 方法

# 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 所注册 ApplicationListener Beans
  • 广播早期 Spring 事件

# BeanFactory 初始化完成阶段

AbstractApplicationContext#finishBeanFactoryInitialization(ConfigurableListableBeanFactory) 方法

  • BeanFactory 关联 ConversionService Bean,如果存在
  • 添加 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 应用上下文已启动事件 - ContextStartedEvent

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

# 参考资料

  • Spring 官方文档之 Core Technologies (opens new window)
  • 《小马哥讲 Spring 核心编程思想》 (opens new window)
📝 帮助改善此页面! (opens new window)
#Java#框架#Spring
上次更新: 2023/01/31, 20:55:48
Spring 配置元数据
Spring AOP

← Spring 配置元数据 Spring AOP→

最近更新
01
Spring 访问 Redis
01-31
02
Spring EL 表达式
01-12
03
Spring Environment 抽象
12-23
更多文章>
Theme by Vdoing | Copyright © 2019-2023 钝悟(dunwu) | CC-BY-SA-4.0
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×