请描述 Spring 容器中 Bean 从创建到销毁的完整生命周期流程,包括实例化、属性填充、初始化以及销毁等关键阶段。
考察说明
考查对 Spring IoC 容器核心机制的理解,以及 Bean 生命周期中各回调时机的掌握。
回答思路
- 【回答框架 1】Bean 生命周期可概括为实例化、属性填充、初始化、使用和销毁五个阶段。容器通过 BeanPostProcessor 和 Aware 接口在关键节点插入回调,从而支持扩展。
- 【回答框架 2】实例化阶段通过构造器或工厂方法创建 Bean 实例;随后进行属性填充,即依赖注入,处理 @Autowired、XML 或 Java 配置中的依赖引用。同时会触发 BeanNameAware、BeanFactoryAware 等 Aware 接口回调。
- 【回答框架 3】初始化阶段先调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法,然后执行 InitializingBean 的 afterPropertiesSet 或自定义 init-method,再执行 postProcessAfterInitialization。该阶段常用于初始化资源、校验配置等。
- 【回答框架 4】Bean 使用期间容器持有其引用;当容器关闭或 Bean 不再需要时,先调用 DisposableBean 的 destroy 方法或自定义 destroy-method,完成资源释放。注意原型作用域的 Bean 不负责销毁回调。
- 【关键点 1】生命周期顺序:实例化、属性填充、Aware 回调、BeanPostProcessor 前置处理、初始化和后置处理、销毁。
- 【关键点 2】BeanPostProcessor 对容器内所有 Bean 生效,是 AOP 等扩展的切入点。
- 【关键点 3】InitializingBean 和 init-method 都用于初始化,建议优先使用注解或 XML 声明以降低耦合。
- 【关键点 4】单例 Bean 生命周期由容器管理,原型 Bean 实例化后容器不再跟踪其销毁。
- 【易错点 1】混淆 BeanPostProcessor 与 BeanFactoryPostProcessor;前者作用于 Bean 实例,后者作用于 Bean 定义。
- 【易错点 2】忘记销毁回调对原型 Bean 不生效,导致资源无法自动释放。
- 【易错点 3】初始化顺序依赖 Bean 依赖关系,若存在循环依赖需注意早期引用对生命周期的影响。