Skip to content
极高困难

一句话答案

实例化→属性注入→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-method

记忆要点:

  • AOP 代理在第⑩步(postProcessAfterInitialization)生成,不是第⑥步
  • 初始化顺序:@PostConstruct > afterPropertiesSet() > init-method
  • 销毁顺序:@PreDestroy > destroy() > destroy-method
追问与易错

追问方向:

  • BeanPostProcessor 在什么时候执行?能做什么?(初始化前后,AOP 代理就在后置处理中生成)
  • @PostConstruct 和 InitializingBean 的执行顺序?(@PostConstruct → afterPropertiesSet → init-method)
  • Spring 的 Bean 什么时候被销毁?(容器关闭时调用 destroy 方法)

易错点:

  • ❌ 生命周期回调顺序记错——属性注入在 Aware 回调之前
  • ❌ "prototype 作用域的 Bean 也有销毁回调"——Spring 不管理 prototype Bean 的销毁

💡 记忆锚点

Bean一生像入职流程:实例化(发offer) -> 属性注入(配电脑工位) -> Aware回调(发工牌门禁) -> BeanPostProcessor前置 -> @PostConstruct/afterPropertiesSet/init-method(三轮入职培训) -> 后置处理(AOP代理在这步包装) -> 干活 -> 销毁(离职三步:@PreDestroy/destroy/destroy-method)。