Bean 的生命周期指的是一个对象在 Spring 容器中从创建、初始化到被使用再到最终销毁所经历的完整过程。这道题是面试高频题但很多人备考时习惯去网上找帖子背图。其实不需要死记硬背把核心阶段理解透自然能用自己的话讲清楚。BeanFactory 接口的源码注释中明确说明它的实现类应当支持标准的 Bean 生命周期接口并给出了标准初始化方法及其顺序。一、源码入口从 refresh 到 doCreateBean在refresh()流程中Bean 的创建最终会进入finishBeanFactoryInitialization()。这里会遍历容器中所有需要初始化的 BeanBean 名先被收集进beanNames集合并依次调用getBean()完成实例化。getBean()内部继续进入doGetBean()。当缓存中不存在目标 Bean 时会进一步调用createBean()最终来到真正负责创建对象的doCreateBean()。Spring 源码中很多以 do 开头的方法承担核心执行逻辑分析源码时通常需要重点关注。二、实例化靠反射生成对象createBeanInstance()的职责就是完成 Bean 实例化。Spring 底层仍然采用 Java 反射创建对象本质流程与手写反射一致先获取Class对象再获取构造器最后通过反射调用构造方法生成实例。实际代码中多数是无参构造因此会通过getDeclaredConstructor()获取无参构造器再交由BeanUtils工具类调用ctor.newInstance()完成实例化。三、填充属性populateBean实例化完成后进入populateBean()负责为 Bean 注入依赖和属性值。属性注入完成后Bean 还不能立即对外提供服务。接下来进入初始化阶段这也是 Bean 生命周期最重要的一部分。四、初始化Aware、后置处理器与初始化方法初始化阶段首先处理各种 Aware 接口例如BeanNameAware、BeanFactoryAware等。Spring 会把容器相关信息注入 Bean使其能够感知自身所处的运行环境。随后执行BeanPostProcessor的前置方法postProcessBeforeInitialization()。之后进入初始化方法如果 Bean 实现了InitializingBean接口会调用afterPropertiesSet()。Bean 的创建全程由容器完成若需要在属性装配完成后执行收尾逻辑afterPropertiesSet()是常用的扩展点。如果配置中指定了init-method会执行对应的自定义初始化方法不过这种方式相对少用。最后执行BeanPostProcessor的后置方法postProcessAfterInitialization()。如果 Bean 需要增强例如使用 AOP这一步会返回代理对象而不是最初创建的原始对象。初始化方式使用方式推荐程度InitializingBean实现接口重写afterPropertiesSet()常用扩展点属性装配后的收尾机会init-method配置中指定自定义方法名相对少用后置方法执行完毕Bean 的创建流程就全部完成。五、使用与销毁初始化完成后Bean 即可对外提供服务通过getBean()获取使用。容器关闭时Bean 进入销毁阶段销毁方式与初始化对应如果 Bean 实现了DisposableBean接口会调用destroy()方法释放资源一类的收尾逻辑通常放在这里。如果配置中指定了destroy-method会执行对应的自定义销毁方法同样相对少用。需要注意的是容器只负责单例 Bean 的销毁prototype 作用域的 Bean 交出实例后便不再归容器管理。整个 Bean 生命周期可以归纳为下面八个阶段实例化反射生成对象→ 填充属性 → 调用 Aware 接口 → 执行 BeanPostProcessor 前置 → 初始化afterPropertiesSet / init-method→ 执行 BeanPostProcessor 后置AOP 代理通常在此阶段生成→ 使用 → 销毁。
Spring Bean 的生命周期到底是什么?
Bean 的生命周期指的是一个对象在 Spring 容器中从创建、初始化到被使用再到最终销毁所经历的完整过程。这道题是面试高频题但很多人备考时习惯去网上找帖子背图。其实不需要死记硬背把核心阶段理解透自然能用自己的话讲清楚。BeanFactory 接口的源码注释中明确说明它的实现类应当支持标准的 Bean 生命周期接口并给出了标准初始化方法及其顺序。一、源码入口从 refresh 到 doCreateBean在refresh()流程中Bean 的创建最终会进入finishBeanFactoryInitialization()。这里会遍历容器中所有需要初始化的 BeanBean 名先被收集进beanNames集合并依次调用getBean()完成实例化。getBean()内部继续进入doGetBean()。当缓存中不存在目标 Bean 时会进一步调用createBean()最终来到真正负责创建对象的doCreateBean()。Spring 源码中很多以 do 开头的方法承担核心执行逻辑分析源码时通常需要重点关注。二、实例化靠反射生成对象createBeanInstance()的职责就是完成 Bean 实例化。Spring 底层仍然采用 Java 反射创建对象本质流程与手写反射一致先获取Class对象再获取构造器最后通过反射调用构造方法生成实例。实际代码中多数是无参构造因此会通过getDeclaredConstructor()获取无参构造器再交由BeanUtils工具类调用ctor.newInstance()完成实例化。三、填充属性populateBean实例化完成后进入populateBean()负责为 Bean 注入依赖和属性值。属性注入完成后Bean 还不能立即对外提供服务。接下来进入初始化阶段这也是 Bean 生命周期最重要的一部分。四、初始化Aware、后置处理器与初始化方法初始化阶段首先处理各种 Aware 接口例如BeanNameAware、BeanFactoryAware等。Spring 会把容器相关信息注入 Bean使其能够感知自身所处的运行环境。随后执行BeanPostProcessor的前置方法postProcessBeforeInitialization()。之后进入初始化方法如果 Bean 实现了InitializingBean接口会调用afterPropertiesSet()。Bean 的创建全程由容器完成若需要在属性装配完成后执行收尾逻辑afterPropertiesSet()是常用的扩展点。如果配置中指定了init-method会执行对应的自定义初始化方法不过这种方式相对少用。最后执行BeanPostProcessor的后置方法postProcessAfterInitialization()。如果 Bean 需要增强例如使用 AOP这一步会返回代理对象而不是最初创建的原始对象。初始化方式使用方式推荐程度InitializingBean实现接口重写afterPropertiesSet()常用扩展点属性装配后的收尾机会init-method配置中指定自定义方法名相对少用后置方法执行完毕Bean 的创建流程就全部完成。五、使用与销毁初始化完成后Bean 即可对外提供服务通过getBean()获取使用。容器关闭时Bean 进入销毁阶段销毁方式与初始化对应如果 Bean 实现了DisposableBean接口会调用destroy()方法释放资源一类的收尾逻辑通常放在这里。如果配置中指定了destroy-method会执行对应的自定义销毁方法同样相对少用。需要注意的是容器只负责单例 Bean 的销毁prototype 作用域的 Bean 交出实例后便不再归容器管理。整个 Bean 生命周期可以归纳为下面八个阶段实例化反射生成对象→ 填充属性 → 调用 Aware 接口 → 执行 BeanPostProcessor 前置 → 初始化afterPropertiesSet / init-method→ 执行 BeanPostProcessor 后置AOP 代理通常在此阶段生成→ 使用 → 销毁。