Spring容器管理单例Bean生命周期:定义加载→实例化→属性注入→初始化(Aware→postProcessBeforeInitialization→@PostConstruct→afterPropertiesSet→init-method→postProcessAfterInitialization)→销毁(destroy-method/DisposableBean),prototype仅创建不托管销毁。

面试时讲 Bean 生命周期,关键不是背步骤,而是理清主线、突出重点、逻辑自洽。一句话概括:Spring 容器从定义加载开始,到实例化、注入、初始化、使用,最后销毁——单例 Bean 的整个过程由容器全程托管,且每个阶段都留有扩展入口。
先说清楚生命周期适用范围
明确前提能避免踩坑:默认讨论的是 singleton 作用域的 Bean。prototype 类型的 Bean,Spring 只负责创建和注入,后续生命周期由使用者自己管理,容器不参与销毁。
按时间线分五步讲清主干
用简洁、连贯的语言串起核心流程,不堆砌术语:
- 定义加载:容器启动时扫描 @Component、@Bean 或 XML 配置,把元信息封装成 BeanDefinition,存入 BeanFactory —— 相当于“招聘前写好岗位说明书”
- 实例化:根据 BeanDefinition 调用构造方法(或工厂方法),生成原始对象 —— 此时属性全为 null,还没注入任何依赖
- 属性注入:完成依赖解析,把 @Autowired 的其他 Bean、配置值等设入字段 —— 对象有了“基本装备”,但尚未就绪可用
-
初始化:这是最易混淆也最常被追问的环节,顺序固定:
→ Aware 接口回调(BeanNameAware → BeanFactoryAware → ApplicationContextAware)
→ BeanPostProcessor.postProcessBeforeInitialization()
→ @PostConstruct 方法
→ afterPropertiesSet()(InitializingBean)
→ 自定义 init-method
→ BeanPostProcessor.postProcessAfterInitialization() -
销毁:仅对 singleton Bean,在容器关闭前触发:
→ DisposableBean.destroy()
→ 自定义 destroy-method
点出两个高频追问点怎么答
提前预判问题,让回答更有深度:
立即学习“Java免费学习笔记(深入)”;
- Aware 接口在哪调用?在属性注入之后、初始化之前,属于初始化准备阶段;它让 Bean 主动感知容器环境,比如拿到 Bean 名称或 ApplicationContext 实例
- BeanPostProcessor 和 InitializingBean 谁先?postProcessBeforeInitialization 在 afterPropertiesSet 之前,postProcessAfterInitialization 在其之后;前者可用于包装代理、校验字段,后者常用于 AOP 增强后的最终检查
结尾可自然收束
可以加一句:“理解这个流程,不仅能答好面试题,也能精准选择回调时机做初始化加载、资源预热、连接池建立等实际工作。”


















