Spring Bean 生命周期整体划分为实例化阶段、属性填充阶段、初始化阶段、销毁阶段四大核心阶段,每个阶段包含细分执行步骤与核心逻辑,以下是各阶段完整明细说明。
一、实例化阶段
阶段核心作用
完成 Bean 定义的加载解析,通过反射创建 Bean 空实例对象,仅完成对象创建,未进行属性赋值。
阶段详细执行步骤
- 加载并解析 Bean 定义 Spring 容器读取配置信息(注解 / XML),包括
@Component、@Bean、<bean>标签等,解析每个 Bean 的类全路径、作用域、依赖关系等配置信息。 - 封装 BeanDefinition 对象 将解析后的 Bean 配置信息,封装成
BeanDefinition对象,统一存储到 Bean 定义注册表中,供后续实例化使用。 - 反射实例化 Bean 对象 容器根据
BeanDefinition中的类信息,通过 Java 反射机制,调用 Bean 的构造方法(无参 / 有参构造),创建 Bean 的空实例对象,此时对象所有属性均为默认值(null、0 等)。 - 阶段收尾完成空对象创建,进入下一属性填充阶段,单例 Bean 会提前暴露对象引用,为解决循环依赖做准备。
二、属性填充阶段
阶段核心作用
完成 Bean 的依赖注入与属性赋值,为空实例对象填充所有依赖对象和普通属性值。
阶段详细执行步骤
- 依赖注入解析容器扫描 Bean 中的注入注解和配置,识别需要注入的依赖、属性值。
- 执行注解驱动的属性注入 通过
@Autowired、@Resource、@Qualifier等注解,完成依赖对象的自动装配;通过@Value注解,完成普通属性、配置文件值、SpEL 表达式的注入。 - Setter 方法属性赋值针对 XML 配置或 Java 配置中指定的 setter 方式,调用对应 setter 方法完成属性填充。
- 集合 / 数组类型注入对 List、Map、数组等集合类型属性,自动装配同类型所有 Bean,完成集合属性赋值。
- 阶段收尾所有属性、依赖全部注入完成,Bean 对象具备完整属性,进入初始化阶段。
三、初始化阶段
阶段核心作用
对完成属性填充的 Bean 进行初始化增强,执行自定义初始化逻辑,生成代理对象,让 Bean 达到可用状态。
阶段详细执行步骤
- 执行 Aware 接口回调 按顺序调用 Aware 系列接口,让 Bean 获取 Spring 容器资源:
- 执行
BeanNameAware#setBeanName:获取 Bean 在容器中的名称 - 执行
BeanFactoryAware#setBeanFactory:获取 BeanFactory 容器对象 - 执行
ApplicationContextAware#setApplicationContext:获取应用上下文对象
- 执行
- 执行 BeanPostProcessor 前置处理 调用
BeanPostProcessor#postProcessBeforeInitialization方法,对 Bean 进行初始化前的增强处理。 - 执行自定义初始化方法 按固定顺序执行三种初始化逻辑:
- 执行
@PostConstruct注解标注的方法 - 执行
InitializingBean#afterPropertiesSet接口方法 - 执行
@Bean(initMethod)或 XML 配置的自定义初始化方法
- 执行
- 执行 BeanPostProcessor 后置处理 调用
BeanPostProcessor#postProcessAfterInitialization方法,完成 Bean 的 AOP 代理生成,这是初始化阶段最后一步。 - 阶段收尾初始化完成,Bean 成为完全可用的对象,存入单例池(单例 Bean),供业务使用。
四、销毁阶段
阶段核心作用
容器关闭时,释放 Bean 资源,执行自定义销毁逻辑,完成资源回收。
阶段详细执行步骤
- 容器触发关闭信号 调用
context.close()方法关闭 Spring 容器,容器开始对单例 Bean 执行销毁逻辑(原型 Bean 不交由容器管理销毁)。 - 执行自定义销毁方法 按固定顺序执行三种销毁逻辑:
- 执行
@PreDestroy注解标注的方法 - 执行
DisposableBean#destroy接口方法 - 执行
@Bean(destroyMethod)或 XML 配置的自定义销毁方法
- 执行
- 资源释放与对象销毁完成资源释放、连接关闭等操作后,容器移除 Bean 实例,完成整个生命周期。
四大阶段核心总结
- 实例化阶段:加载配置→反射创建空对象
- 属性填充阶段:依赖注入→属性赋值
- 初始化阶段:Aware 回调→初始化方法→AOP 代理
- 销毁阶段:执行销毁逻辑→资源回收