介绍一下 Spring 容器的生命周期

BeanFactory 是 Spring IoC 底层容器,ApplicationContext 是它的超集有更多能力,所以这里以重点说下 ApplicationContext。

ApplicationContext 生命周期的入口在 AbstractApplicationContext#refresh 方法(参照小马哥的 Spring 专栏课件)

1、应用上下文启动准备。AbstractApplicationContext#prepareRefresh
    启动时间 startupDate
    状态标识 closed(false) active(true)
    初始化 PropertSources - initPropertySources
    校验 Environment 必须属性
    初始化早期 Spring 事件集合

2、BeanFactory 创建。AbstractApplicationContext#obtainFreshBeanFactory
    已存在 BeanFactory,先销毁 bean、关闭 BeanFactory
    创建 BeanFactory createBeanFactory
    设置 BeanFactory id
    customizeBeanFactory 方法中,是否可以重复 BeanDefinition、是否可以循环依赖设置
    loadBeanDefinitions 方法,加载 BeanDefinition
    赋值该 BeanFactory 到 ApplicationContext 中

3、BeanFactory 准备。AbstractApplicationContext#prepareBeanFactory
    设置 BeanClassLoader
    设置 Bean 表达式处理器
    添加 PropertyEditorRegistrar 的实现对象 ResourceEditorRegistrar
    添加 BeanPostProcessor
    忽略 Aware 接口作为依赖注入的接口
    注册 ResovlableDependency 对象:BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
    注册 ApplicationListenerDetector 对象
    注册 LoadTimeWeaverAwareProcessor 对象
    注册单例对象 Environment、Java System Properties、OS 环境变量

4、BeanFactory 后置处理。AbstractApplicationContext#postProcessBeanFactory、invokeBeanFactoryPostProcessors
    postProcessBeanFactory 方法由子类覆盖
    调用 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()) 方法
    注册 LoadTimeWeaverAwareProcessor
    设置 TempClassLoader

5、BeanFactory 注册 BeanPostProcessor。AbstractApplicationContext#registerBeanPostProcessors
    PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
        注册 PriorityOrdered 类型的 BeanPostProcessor Beans
        注册 Ordered 类型的 BeanPostProcessor Beans
        注册普通的 BeanPostProcessor Beans(nonOrderedPostProcessors)
        注册 MergedBeanDefinitionPostProcessor Beans(internalPostProcessors)
        注册 ApplicationListenerDetector 对象

6、初始化内建 Bean - MessageSource。AbstractApplicationContext#initMessageSource
    若不存在 messageSource bean,注册单例 bean DelegatingMessageSource
    若存在且需要设置层级,进行设置

7、初始化内建 Bean - Spring 广播器。AbstractApplicationContext#initApplicationEventMulticaster
    若不存在 applicationEventMulticaster bean,注册单例 bean SimpleApplicationEventMulticaster
    存在则设置为当前属性

8、Spring 应用上下文刷新。AbstractApplicationContext#onRefresh
    留给子类覆盖

9、Spring 事件监听器注册。AbstractApplicationContext#registerListeners
    添加 ApplicationListener 对象
    添加 BeanFactory 所注册的 ApplicationListener Beans
    广播早期事件

10、BeanFactory 初始化完成。AbstractApplicationContext#finishBeanFactoryInitialization
    如果存在设置 conversionService Bean
    添加 StringValueResolver
    查找 LoadTimeWeaverAware Bean
    BeanFactory 置空 tempClassLoader
    BeanFactory 解冻 的配置
    BeanFactory 初始化非延迟单例 Bean

11、Spring 应用上下文刷新完成。AbstractApplicationContext#finishRefresh
    清空 ResourceLoader 缓存
    初始化 LifeCycleProcessor 对象
    调用 LifeCycleProcessor#onRefresh 方法
    发布上下文 ContextRefreshedEvent 已刷新事件
    向 MBeanServer 托管 Live Beans

12、Spring 应用上下文启动。AbstractApplicationContext#start
    查找和启动 LifeCycleProcessor
    发布上下文 ContextStartedEvent 已启动事件

13、Spring 应用下文停止。AbstractApplicationContext#stop
    查找和启动 LifeCycleProcessor
    发布上下文 ContextStoppedEvent 已停止事件

14、Spring 应用下文关闭。AbstractApplicationContext#close
    状态标识 closed(true) active(false)
    Live Bean JMX 撤销托管
    发布上下文 ContextClosedEvent 已关闭事件
    查找和关闭 LifeCycleProcessor
    销毁所有 Bean
    关闭 BeanFactory
    onClose 方法回调
    早期事件处理
    移除 ShutdownHook

 

 


【Java面试题与答案】整理推荐

Spring 容器生命周期可以分为三个阶段:实例化、初始化和销毁。 1. 实例化阶段:在这个阶段,Spring 容器会根据配置文件或注解等方式,创建并实例化所有的 Bean 对象。这个阶段主要包括以下步骤: - 加载配置文件或扫描注解,获取所有的 Bean 定义。 - 根据 Bean 定义创建相应的 Bean 实例。 - 对于单例的 Bean,容器会在这个阶段创建并保留其实例。 2. 初始化阶段:在实例化阶段完成后,Spring 容器会对实例化的 Bean 进行初始化。这个阶段主要包括以下步骤: - 设置 Bean 的属性值,包括依赖注入。 - 调用 Bean 的初始化方法,可以通过配置文件或注解指定初始化方法。 - 执行 BeanPostProcessor 的前置处理方法。 - 对于单例的 Bean,容器会在这个阶段完成其初始化。 3. 销毁阶段:在容器关闭时,会执行销毁阶段,对已经初始化的 Bean 进行销毁和清理工作。这个阶段主要包括以下步骤: - 调用 Bean 的销毁方法,可以通过配置文件或注解指定销毁方法。 - 执行 BeanPostProcessor 的后置处理方法。 需要注意的是,对于单例的 Bean,默认情况下 Spring 容器会管理其完整的生命周期,而对于原型(prototype)作用域的 Bean,则不负责销毁。如果需要在原型 Bean 销毁时执行一些清理工作,可以使用自定义的销毁回调方法或者手动管理。 以上是 Spring 容器的基本生命周期,可以通过配置文件或注解等方式来控制和管理 Bean 的生命周期
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值