★ Bean 生命周期完整过程
结论先行:Spring Bean 生命周期的主线是 实例化 → 属性填充/依赖注入 → Aware 回调 → 初始化前 → 初始化 → 初始化后(AOP 代理诞生处)→ 就绪使用 → 销毁。面试抓两个关键词:BeanPostProcessor(前后置两把刀) 和 初始化三件套(@PostConstruct / InitializingBean / init-method);再记一个高频落点:@Autowired 在属性填充阶段、AOP 代理在初始化后阶段产生。
一、完整过程(按序)
- 解析并合并 BeanDefinition(确定类、作用域、依赖、init/destroy 方法);
- InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation:可在此返回代理,直接跳过后续默认流程(少见);
- 实例化:构造器/工厂方法创建原始对象(解决构造器循环依赖就卡在这一步);
- 属性填充 populateBean:Setter/字段赋值,@Autowired、@Value、@Resource 由后置处理器在 postProcessProperties 中注入;
- Aware 回调(按序):BeanNameAware → BeanFactoryAware → ApplicationContextAware(拿容器上下文);
- BeanPostProcessor.postProcessBeforeInitialization:初始化前置处理;
- 初始化(按序):@PostConstruct → InitializingBean.afterPropertiesSet() → 自定义 init-method;
- BeanPostProcessor.postProcessAfterInitialization:AOP 代理(@Transactional/@Async/@Aspect)在此创建,返回的可能是代理而非原始对象;
- Bean 就绪,可被使用;
- 容器关闭销毁(按序):@PreDestroy → DisposableBean.destroy() → 自定义 destroy-method。
二、代码验证顺序
@Component
public class DemoBean implements InitializingBean, DisposableBean {
@PostConstruct
public void postConstruct() { System.out.println("1 @PostConstruct"); }
@Override
public void afterPropertiesSet() { System.out.println("2 InitializingBean"); }
@PreDestroy
public void preDestroy() { System.out.println("A @PreDestroy"); }
@Override
public void destroy() { System.out.println("B DisposableBean.destroy"); }
}
// 输出顺序:1 → 2 →(使用)→ A → B
常见追问 / 记忆点
- 追问 1:AOP 代理在哪一步生成?答:AbstractAutoProxyCreator 作为 BeanPostProcessor 在 postProcessAfterInitialization(第 8 步)创建代理。
- 追问 2:@Autowired 与 @PostConstruct 谁先执行?答:@Autowired(属性填充第 4 步)先于 @PostConstruct(初始化第 7 步),所以初始化方法里依赖一定已注入。
- 追问 3: Aware 回调顺序?答:BeanName → BeanFactory → ApplicationContext。
- 记忆点:口诀"实例化 → 注入 → Aware → 前置 → 初始化 → 后置(出代理)→ 销毁";扩展点两把刀:BeanPostProcessor 与 Aware。