直接回答:单例 Bean 的生命周期主线是:实例化 → 属性填充 → Aware 回调 → 初始化前后被 BeanPostProcessor 加工 → 初始化 → 就绪使用 → 容器关闭时销毁。

展开解析(按顺序):

  1. 实例化:调用构造器创建对象(此时属性都未注入);
  2. 属性填充populateBean 完成依赖注入;
  3. Aware 接口回调:依次调用 BeanNameAwareBeanFactoryAwareApplicationContextAware 等,让 Bean 感知容器环境;
  4. BeanPostProcessor#postProcessBeforeInitialization
  5. 初始化@PostConstruct 方法 → InitializingBean.afterPropertiesSet() → 自定义 init-method
  6. BeanPostProcessor#postProcessAfterInitialization(AOP 代理通常在这一步生成,返回的可能是代理对象);
  7. 就绪:放入单例池供使用;
  8. 销毁@PreDestroyDisposableBean.destroy() → 自定义 destroy-method

易错点

  • BeanPostProcessor 针对每个 Bean 生效,不要在里面做重操作;
  • 只有单例 Bean 的销毁由容器管理,prototype 容器不负责销毁;
  • 构造器中拿不到已注入的依赖,需要初始化逻辑请放在 @PostConstruct

追问BeanFactoryPostProcessorBeanPostProcessor 的区别(前者改 BeanDefinition,作用于容器启动阶段)、FactoryBean 的特殊性。