极高 困难
Bean生命周期#
一句话答案#
实例化→属性注入→Aware 回调→BeanPostProcessor 前置→InitializingBean/init-method→后置处理→使用→销毁。
核心要点
完整的 Bean 生命周期(14 步):
① 实例化(Instantiation)
→ 通过构造函数或工厂方法创建 Bean 实例(此时属性都是默认值)
② 属性填充(Populate Properties)
→ 依赖注入:将 @Autowired / @Value 等注解的属性值注入 Bean
③ 调用 BeanNameAware.setBeanName()
→ 如果 Bean 实现了 BeanNameAware,注入 Bean 的 id/name
④ 调用 BeanFactoryAware.setBeanFactory()
→ 如果实现了 BeanFactoryAware,注入 BeanFactory
⑤ 调用 ApplicationContextAware.setApplicationContext()
→ 如果实现了 ApplicationContextAware,注入 ApplicationContext
⑥ 调用 BeanPostProcessor.postProcessBeforeInitialization()
→ 所有 BeanPostProcessor 的前置处理(可修改 Bean)
→ ✅ AOP 代理对象在此处创建(注意:是 postProcessAfterInitialization,即第⑩步)
⑦ 调用 @PostConstruct 方法(JSR-250)
→ 标注了 @PostConstruct 的方法在此执行
⑧ 调用 InitializingBean.afterPropertiesSet()
→ 如果实现了 InitializingBean,此方法在属性注入后执行
⑨ 调用自定义 init-method
→ XML 中 init-method 或 @Bean(initMethod="...") 指定的初始化方法
⑩ 调用 BeanPostProcessor.postProcessAfterInitialization()
→ 所有 BeanPostProcessor 的后置处理
→ ✅ AOP 代理在此步骤生成(AbstractAutoProxyCreator 实现此接口)
── Bean 可以正常使用 ──
⑪ 调用 @PreDestroy 方法(容器关闭前)
⑫ 调用 DisposableBean.destroy()
⑬ 调用自定义 destroy-methodplaintext记忆要点:
- AOP 代理在第⑩步(postProcessAfterInitialization)生成,不是第⑥步
- 初始化顺序:
@PostConstruct>afterPropertiesSet()>init-method - 销毁顺序:
@PreDestroy>destroy()>destroy-method
面试回答(2分钟版)
Spring Bean的生命周期可以概括为四个大阶段:实例化、属性填充、初始化和销毁。首先容器通过反射调用构造函数创建Bean实例,此时属性都是默认值。接着进行依赖注入,把@Autowired和@Value标注的属性值填充进去。然后依次执行Aware系列回调,包括BeanNameAware、BeanFactoryAware和ApplicationContextAware,让Bean能感知到容器环境。之后进入初始化阶段,BeanPostProcessor的前置处理先执行,然后是@PostConstruct注解方法、InitializingBean的afterPropertiesSet方法、最后是自定义init-method,三者顺序固定。特别要注意的是AOP代理对象是在BeanPostProcessor的后置处理即postProcessAfterInitialization中由AbstractAutoProxyCreator生成的,不是前置处理。Bean使用完毕后容器关闭时按@PreDestroy、DisposableBean.destroy()、自定义destroy-method的顺序执行销毁回调。还有一点要注意,prototype作用域的Bean,Spring只负责创建不负责销毁。
追问与易错
追问方向:
- “BeanPostProcessor 在什么时候执行?能做什么?”→ 在 Bean 初始化前后执行,前置处理可修改 Bean 属性,后置处理可替换 Bean(AOP 代理就在 postProcessAfterInitialization 中由 AbstractAutoProxyCreator 生成)
- “@PostConstruct 和 InitializingBean 的执行顺序?”→ @PostConstruct(JSR-250 注解)先执行 → InitializingBean.afterPropertiesSet() → 自定义 init-method,三者顺序固定
- “Spring 的 Bean 什么时候被销毁?”→ 容器关闭时(调用 close() 或注册 ShutdownHook),按 @PreDestroy → DisposableBean.destroy() → 自定义 destroy-method 顺序执行;prototype Bean 不由 Spring 管理销毁
易错点:
- ❌ 生命周期回调顺序记错——属性注入在 Aware 回调之前
- ❌ “prototype 作用域的 Bean 也有销毁回调”——Spring 不管理 prototype Bean 的销毁