Spring Bean的生命周期

通俗易懂!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 又近了一大步!冲!

文章已创建 3017

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部