直接回答:单例 Bean 的生命周期主线是:实例化 → 属性填充 → Aware 回调 → 初始化前后被 BeanPostProcessor 加工 → 初始化 → 就绪使用 → 容器关闭时销毁。
展开解析(按顺序):
- 实例化:调用构造器创建对象(此时属性都未注入);
- 属性填充:
populateBean完成依赖注入; - Aware 接口回调:依次调用
BeanNameAware、BeanFactoryAware、ApplicationContextAware等,让 Bean 感知容器环境; BeanPostProcessor#postProcessBeforeInitialization;- 初始化:
@PostConstruct方法 →InitializingBean.afterPropertiesSet()→ 自定义init-method; BeanPostProcessor#postProcessAfterInitialization(AOP 代理通常在这一步生成,返回的可能是代理对象);- 就绪:放入单例池供使用;
- 销毁:
@PreDestroy→DisposableBean.destroy()→ 自定义destroy-method。
易错点:
- BeanPostProcessor 针对每个 Bean 生效,不要在里面做重操作;
- 只有单例 Bean 的销毁由容器管理,prototype 容器不负责销毁;
- 构造器中拿不到已注入的依赖,需要初始化逻辑请放在
@PostConstruct。
追问:BeanFactoryPostProcessor 与 BeanPostProcessor 的区别(前者改 BeanDefinition,作用于容器启动阶段)、FactoryBean 的特殊性。