Spring Bean 的生命周期

我精心收集了一份10万字的java全面知识总结,包括了java几乎所有的面试基础解读,有兴趣可以获取看看
领取方式

https://pan.quark.cn/s/4e6e3d03407a

一、概览

Spring Bean 生命周期从实例化开始,到销毁结束,涵盖了多个步骤:实例化、属性赋值、初始化、销毁。

从源码角度看,Bean 的加载过程由多个组件协同完成,重点集中在 refresh() 方法内部。
整个流程遵循 IOC 容器的初始化规则,通过 BeanFactoryApplicationContext 协作完成。

二、生命周期整体流程

Bean 的生命周期主要包括以下阶段:

  1. 实例化:通过构造方法创建对象;
  2. 属性赋值:注入依赖;
  3. 初始化:执行初始化方法;
  4. 使用中:提供服务;
  5. 销毁:容器关闭时执行清理操作。

下面从容器启动和 Bean 加载两个角度看源码过程。


三、容器启动过程

Spring 容器的入口在 AbstractApplicationContext#refresh() 方法。主要步骤如下:

1. prepareRefresh()

做基础准备工作,设置启动时间、配置校验、初始化环境等。

2. obtainFreshBeanFactory()

加载或刷新 BeanFactory。通常调用的是 AbstractRefreshableApplicationContext#refreshBeanFactory()

ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

3. prepareBeanFactory(beanFactory)

设置一些标准配置,比如:

  • 设置类加载器;
  • 注册默认的 BeanPostProcessor;
  • 设置表达式解析器;
  • 设置自动装配规则等。

四、Bean 的加载与注册

1. invokeBeanFactoryPostProcessors(beanFactory)

处理 BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessor

这些后处理器能动态修改 Bean 定义,参与容器启动前的准备。

2. registerBeanPostProcessors(beanFactory)

注册所有实现了 BeanPostProcessor 接口的类。这些类会在 Bean 实例化前后做处理。

这一步是生命周期的关键节点之一,很多框架扩展点都靠它完成,比如 AOP、注解支持等。


在这里插入图片描述

五、Bean 的创建流程

真正加载 Bean 的入口方法是:

getBean("xxx")

内部调用的是 AbstractBeanFactory#doGetBean() 方法。主要流程如下:

1. 缓存查找

先查一级缓存,是否已有 Bean 实例。

Object sharedInstance = getSingleton(beanName);

如果有,直接返回。

2. 没有就创建

createBean() 方法。最终调用到:

AbstractAutowireCapableBeanFactory#createBean()

六、createBean 详解

这是 Bean 创建的核心方法。主要包括几步:

1. 实例化 Bean

Object beanInstance = resolveBeforeInstantiation(beanName, mbdToUse);

尝试使用 InstantiationAwareBeanPostProcessor 创建实例。如果返回不为 null,说明代理对象已经创建,流程结束。

否则继续调用:

doCreateBean(beanName, mbdToUse, args);

七、doCreateBean 核心流程

这个方法细分为几个步骤:

1. 实例化对象

Object bean = createBeanInstance(beanName, mbd, args);

根据构造方法、工厂方法等策略创建对象。

2. 处理循环依赖(提前暴露)

如果支持循环依赖,会提前把这个 Bean 放入三级缓存:

addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));

3. 属性填充

populateBean(beanName, mbd, instanceWrapper);

处理依赖注入,执行 @Autowired@Value 等注解绑定,也包括手动 setXxx()

依赖注入通过 InstantiationAwareBeanPostProcessor 进行扩展,比如 AutowiredAnnotationBeanPostProcessor


八、初始化过程

1. 调用 Aware 接口

如果 Bean 实现了以下接口,容器会注入相关对象:

  • BeanNameAware
  • BeanClassLoaderAware
  • BeanFactoryAware
  • ApplicationContextAware

这些注入过程在 invokeAwareMethods() 中完成。

2. 执行 BeanPostProcessor 的 postProcessBeforeInitialization

applyBeanPostProcessorsBeforeInitialization(bean, beanName);

所有已注册的 BeanPostProcessor 会被调用。

3. 执行初始化方法

如果实现了 InitializingBean,会执行 afterPropertiesSet() 方法;
如果指定了 init-method,也会调用。

4. 执行 BeanPostProcessor 的 postProcessAfterInitialization

applyBeanPostProcessorsAfterInitialization(bean, beanName);

在这里完成代理增强,AOP、事务、异步等都是在这一步实现。


九、使用中阶段

Bean 初始化完成后,就进入使用阶段。
这个阶段的 Bean 可以被外部获取,也可以被其他 Bean 依赖调用。


十、销毁过程

当容器关闭时,调用 AbstractApplicationContext#close() 方法,触发销毁流程。

destroyBeans();

销毁流程包括:

  • 执行 DisposableBeandestroy() 方法;
  • 调用 @PreDestroy 注解方法;
  • 调用 destroy-method 配置的方法。

十一、Bean 生命周期总结流程图(简述)

构造器(实例化)
    ↓
依赖注入
    ↓
Aware 接口注入
    ↓
前置处理器(postProcessBeforeInitialization)
    ↓
初始化方法(afterPropertiesSet/init-method)
    ↓
后置处理器(postProcessAfterInitialization)
    ↓
使用中
    ↓
容器关闭
    ↓
销毁(destroy-method)

十二、常见扩展点

  • 自定义 BeanPostProcessor:处理初始化前后逻辑;
  • 实现 BeanFactoryPostProcessor:动态修改 BeanDefinition;
  • 使用注解 @PostConstruct@PreDestroy
  • 实现 Aware 接口感知容器状态;
  • 使用 @DependsOn 控制 Bean 加载顺序。

十三、使用建议

  • 初始化逻辑尽量放在 afterPropertiesSet@PostConstruct 中;
  • 销毁逻辑用 @PreDestroydestroy-method
  • 避免在构造器中做依赖逻辑处理;
  • 了解 BeanPostProcessor 对 AOP 等功能的影响;
  • 熟悉源码路径:AbstractBeanFactorycreateBeandoCreateBean

十四、总结

Spring 容器通过一整套标准流程来管理 Bean,从创建、初始化到销毁,都有明确的生命周期节点。
了解这些流程,能更好地掌握 Bean 的行为,也能更准确地定位问题。
Spring 通过扩展接口、注解、处理器等方式提供了完整的定制能力。
掌握这些接口和流程,在开发中可以灵活应对各种需求,写出更健壮、更可控的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值