通俗易懂!Spring Bean 生命周期全流程(2025 面试必画图,背完直接秒杀)
把一个 Bean 从“出生”到“死亡”分成 11 个阶段,像看连续剧一样记住就行(画图时直接从上到下写 1→11):
1. Bean 元信息定义阶段(你写 @Component、@Bean、XML)
2. BeanDefinition 注册(放进大 Map)
3. BeanFactoryPostProcessor 执行(可以改 BeanDefinition)
4. InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(最早插手,可替换对象,如 @Configuration)
5. 实例化(new 对象 / 反射 / 工厂方法)→ 产生“原始对象”
6. 把“半成品引用”放进三级缓存(解决循环依赖的关键!)
7. 属性填充(@Autowired、@Value 注入)
8. InstantiationAwareBeanPostProcessor.postProcessProperties(@Autowired 真正注入点)
9. 执行 Aware 系列回调(setBeanName、setBeanFactory、setApplicationContext)
10. BeanPostProcessor.postProcessBeforeInitialization(@PostConstruct 前一刻)
11. 执行初始化方法(顺序固定!)
├─ @PostConstruct 注解方法
├─ afterPropertiesSet()(实现 InitializingBean)
└─ 自定义 init-method
12. BeanPostProcessor.postProcessAfterInitialization(AOP 生成代理对象在这里!)
13. 正常使用(从一级缓存拿现成的)
14. 容器关闭 → DisposableBean.destroy() / @PreDestroy / destroy-method(死亡阶段)
2025 面试最爱问的 8 个关键节点 + 标准答案
| 问题 | 标准答案(直接背) |
|---|---|
| 1. @PostConstruct 什么时候执行? | 初始化阶段的第 11 步,BeanPostProcessor 的 postProcessBeforeInitialization 之后、after 之前 |
| 2. @Autowired 什么时候注入? | 第 8 步,InstantiationAwareBeanPostProcessor.postProcessProperties(Spring 5+ 主流方式) |
| 3. AOP 代理对象什么时候生成? | 第 12 步,BeanPostProcessor.postProcessAfterInitialization(AnnotationAwareAspectJAutoProxyCreator) |
| 4. 循环依赖是哪个阶段解决的? | 第 6 步,实例化后立刻把 ObjectFactory 放进三级缓存,别人可以提前拿到半成品引用 |
| 5. @Value(“${xxx}”) 什么时候注入? | 和 @Autowired 同一阶段(第 8 步),由同一个 CommonAnnotationBeanPostProcessor 处理 |
| 6. 想在 @Autowired 之前干点事怎么办? | 实现 InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(极少用) |
| 7. Spring Boot 启动时能看到一堆 Bean 创建日志吗? | 能!加日志级别 debug: logging.level.org.springframework=debug 就能看到完整 11 步日志 |
| 8. Bean 是线程安全的吗? | 容器不保证!默认 singleton + 你自己写有状态就是线程不安全(推荐无状态设计) |
经典手绘图(面试 30 秒画完满分版)
┌─────────────────────┐
│ 1. BeanDefinition 注册│
└──────┬──────────────┘
↓
┌─────────────────────┐ ← BeanFactoryPostProcessor
│ 2. 实例化前 │ (@ConfigurationProperties 绑定)
└──────┬──────────────┘
↓
┌─────────────────────┐
│ 3. 实例化(new) │→ 放三级缓存(循环依赖救命点)
└──────┬──────────────┘
↓
┌─────────────────────┐
│ 4. 属性填充(@Autowired、@Value)│
└──────┬──────────────┘
↓
┌─────────────────────┐ ← Aware 回调
│ 5. 初始化前 │ ← @PostConstruct 在这里执行
└──────┬──────────────┘
↓
┌─────────────────────┐ ← AOP 代理在这里生成!
│ 6. 初始化后 │
└──────┬──────────────┘
↓
┌─────────────────────┐
│ 7. 放入一级缓存,正常使用 │
└──────┬──────────────┘
↓
┌─────────────────────┐
│ 8. 容器关闭 → @PreDestroy │
└─────────────────────┘
终极记忆口诀(10 秒背会)
“定义注册 → 实例前 → 实例化放缓存 → 属性填充 → 初始化前(PostConstruct) → 初始化后(AOP 代理) → 使用 → 销毁”
背完这 11 步 + 这张图 + 8 个标准答案,
面试官让你“画一下 Spring Bean 生命周期”,你 1 分钟画完 + 讲完,他直接在简历上写“Spring 原理极扎实”!
现在你已经掌握了 Spring 最重要的底层原理之一,离大厂 Offer 又近了一大步!冲!