当前位置: 首页 > news >正文

【Spring源码07】万字深扒Bean完整生命周期:从创建到销毁全程逐行拆解(面试必刷)

🔥Spring源码全套连载系列(持续更新)

前面六篇我们铺垫完了Spring容器架构、IoC思想、Refresh刷新流程、BeanDefinition、两大后置处理器核心原理。

所有铺垫全部完成,今天正式击穿Spring源码最核心、面试最高频、开发最常用的知识点:Bean完整生命周期

很多开发者工作三五年,只会背生命周期步骤,却完全不懂:

  • Bean到底是何时实例化、何时赋值、何时初始化?

  • 构造方法、@Autowired、@PostConstruct、InitializingBean执行顺序为什么是固定的?

  • AOP代理到底插在生命周期的哪一步?

  • 三级缓存循环依赖是在哪个阶段生效?

  • Bean销毁的触发时机和底层逻辑是什么?

本篇带你从零到一、逐阶段、逐源码拆解Bean完整生命周期,打通Spring Bean从诞生、赋值、初始化、增强、使用、销毁的全链路,彻底告别死记硬背!

一、前置核心认知

1.1 生命周期触发时机

回顾refresh()十二大流程,Bean生命周期的所有核心步骤,全部集中在:步骤11 finishBeanFactoryInitialization(初始化所有非懒加载单例Bean)。

前面所有步骤都是准备工作,这一步才是Bean真正诞生的核心阶段

1.2 完整生命周期总览(先记骨架)

Spring Bean完整生命周期一共10大核心阶段,顺序绝对固定:

加载解析 -> 实例化 -> 构造方法执行 -> 属性填充(依赖注入) -> 初始化前置处理 -> 自定义初始化方法 -> Bean后置增强(AOP) -> 存入单例池 -> 正常使用 -> 容器关闭销毁

1.3 核心结论

BeanDefinition是图纸,生命周期是施工流程,单例池是成品仓库

二、Bean生命周期十步完整源码拆解(超详细)

我们以单例、非懒加载、普通业务Bean为例,全程跟进源码,逐阶段解析!

第一步:Bean定义加载(图纸备案)

对应阶段:refresh()第5步invokeBeanFactoryPostProcessors

核心操作:

  • 通过ConfigurationClassPostProcessor扫描包路径

  • 解析@Component、@Service、@Bean等注解

  • 将Java类封装为BeanDefinition元数据

  • 注册到beanDefinitionMap容器中

当前状态:只有Bean图纸,没有Bean实例,不占用堆内存!

第二步:Bean实例化(对象诞生)

对应源码:createBean()->doCreateBean()->createBeanInstance()

核心操作:

  • Spring根据BeanDefinition获取Bean的Class对象

  • 通过反射机制调用无参/有参构造方法

  • 创建出Bean的原生空对象

关键特点

此时的Bean仅仅是一个空对象,所有属性都是默认值、未完成依赖注入,还不能使用!

重点循环依赖的三级缓存,在这一步提前曝光Bean对象

第三步:属性填充(依赖注入)

对应源码:populateBean()

这一步是@Autowired、@Resource生效的核心阶段!

核心操作:

  • 扫描当前Bean所有属性字段

  • 通过AutowiredAnnotationBeanPostProcessor解析@Autowired

  • 通过CommonAnnotationBeanPostProcessor解析@Resource

  • 从容器单例池中获取依赖Bean

  • 完成属性赋值、依赖注入

执行结果:Bean内部所有依赖对象全部填充完成,属性完整。

第四步:初始化前置处理(Before)

对应源码:initializeBean()->applyBeanPostProcessorsBeforeInitialization()

核心操作:

  • 遍历所有BeanPostProcessor

  • 执行postProcessBeforeInitialization前置方法

经典场景@PostConstruct 注解方法在这里执行!

很多人混淆顺序:@PostConstruct 早于 InitializingBean

第五步:Bean初始化方法执行

这一步包含两个层级的初始化,执行顺序固定:

1、执行Spring内置初始化接口

执行InitializingBean#afterPropertiesSet()方法,Spring内置接口,属性填充完成后自动触发。

2、执行自定义初始化方法

执行BeanDefinition中配置的init-method自定义初始化方法。

执行顺序总结@PostConstruct > afterPropertiesSet > init-method

第六步:初始化后置处理(AOP代理)

对应源码:applyBeanPostProcessorsAfterInitialization()

这是整个生命周期的超级核心!AOP代理诞生地!

核心操作:

  • 遍历所有Bean后置处理器

  • 执行postProcessAfterInitialization后置方法

  • AnnotationAwareAspectJAutoProxyCreator介入

  • 判断当前Bean是否需要切面增强

  • 需要增强则创建JDK动态代理 / Cglib代理

  • 用代理对象替换原生Bean对象

颠覆性认知

我们最终使用的Bean,不一定是自己new的原生对象,而是Spring替换后的代理对象!AOP、事务全部依赖这一步实现。

第七步:Bean存入单例池

对应源码:addSingleton()

核心操作:

  • 完整初始化、可能已被代理增强的Bean对象

  • 存入Spring核心单例池singletonObjects

关键特性

一旦存入单例池,全局唯一、复用终生,后续所有依赖获取的都是这同一个对象。

第八步:Bean就绪,对外提供服务

容器启动完成,Bean完全就绪:

  • 属性填充完毕

  • 初始化完成

  • 代理增强完成

  • 存入单例池

此时可以正常接收请求、执行业务逻辑。

第九步:Bean销毁阶段

触发时机:Spring容器关闭、销毁时

执行顺序:

  • 执行@PreDestroy注解方法

  • 执行DisposableBean#destroy()接口方法

  • 执行自定义destroy-method销毁方法

用于资源释放、连接关闭、缓存清理等收尾操作。

三、生命周期执行顺序终极汇总(必背)

整理全网最标准、最全的执行顺序,面试直接满分:

1. 构造方法实例化2. 属性填充(@Autowired/@Resource)3. @PostConstruct4. InitializingBean后置初始化5. 自定义init方法6. AOP代理增强7. 存入单例池使用8. 容器关闭执行销毁方法

四、高频易错点深度答疑(解决90%困惑)

4.1 为什么@PostConstruct在init方法之前?

因为@PostConstruct属于Bean后置处理器的前置阶段执行,是Spring注解层面的初始化;而InitializingBean和init-method是Bean完整属性填充后的底层初始化,执行层级靠后。

4.2 AOP为什么必须在初始化之后执行?

AOP是对完整可用Bean的增强,必须保证:Bean实例化完成、属性注入完成、初始化完成,确保代理的是一个完整、无缺陷的Bean对象,避免代理半成品对象导致异常。

4.3 循环依赖和生命周期的关系?

循环依赖生效在实例化阶段,Spring提前将半成品Bean放入三级缓存,提前曝光对象引用,解决互相依赖问题,不会影响后续属性填充、初始化、代理流程。

4.4 单例Bean和多例Bean生命周期区别?

  • 单例Bean:容器启动统一创建、初始化、存入单例池,容器销毁才销毁,全局唯一

  • 多例Bean:每次获取才创建,容器不管理、不缓存、不销毁,用完即废

五、完整生命周期代码演示(直观验证)

手写代码,直观看到所有阶段执行顺序,彻底固化认知:

@Service public class UserService implements InitializingBean, DisposableBean { @Autowired private UserDao userDao; // 1. 构造方法:实例化 public UserService() { System.out.println("1、Bean构造方法实例化"); } // 2. 属性注入完成 // 3. 注解初始化 @PostConstruct public void postConstruct() { System.out.println("3、执行@PostConstruct初始化方法"); } // 4. Spring内置初始化接口 @Override public void afterPropertiesSet() throws Exception { System.out.println("4、执行InitializingBean afterPropertiesSet"); } // 5. 自定义初始化方法 public void initMethod() { System.out.println("5、执行自定义init-method初始化"); } // 销毁方法 @PreDestroy public void preDestroy() { System.out.println("容器关闭:执行@PreDestroy销毁方法"); } @Override public void destroy() throws Exception { System.out.println("容器关闭:执行DisposableBean销毁方法"); } }

执行结果完全贴合我们上面梳理的生命周期顺序,无任何偏差。

六、面试满分题库(本篇专属)

1、简单说一下Spring Bean的完整生命周期?

首先容器启动后扫描解析类,生成BeanDefinition注册到容器;随后通过反射实例化Bean空对象,完成属性依赖注入;接着执行@PostConstruct注解初始化方法、InitializingBean初始化方法、自定义init方法;之后通过Bean后置处理器完成AOP代理增强,将完整Bean存入单例池对外提供服务;最后在容器关闭时,执行@PreDestroy、DisposableBean、自定义销毁方法完成资源释放。

2、Bean初始化相关方法的执行顺序?

构造方法实例化 → 属性注入 → @PostConstruct → InitializingBean#afterPropertiesSet → 自定义init-method。

3、AOP代理是在Bean生命周期的哪个阶段创建?

在Bean初始化完成之后,执行BeanPostProcessor的postProcessAfterInitialization方法阶段,由AnnotationAwareAspectJAutoProxyCreator完成动态代理对象的创建与替换。

4、Bean实例化和初始化的区别?

实例化是通过反射创建空的Bean对象,仅仅开辟内存;初始化是在对象创建、属性填充完成后,执行各类初始化方法、完成代理增强,让Bean成为一个完整可用的业务对象。

5、单例Bean什么时候创建、什么时候销毁?

非懒加载单例Bean在容器刷新finishBeanFactoryInitialization阶段统一创建;在Spring容器关闭时统一执行销毁逻辑、释放资源。

七、本篇总结&下期预告

本篇总结

本篇我们彻底吃透了Spring Bean完整生命周期,打通了IoC容器最核心的执行链路:

  • 掌握了Bean从定义、实例化、赋值、初始化、增强、销毁的10大完整阶段

  • 彻底理清了各类初始化方法的固定执行顺序

  • 搞懂了AOP代理、循环依赖在生命周期中的位置

  • 区分了实例化与初始化的本质区别

  • 汇总了面试高频满分答案,彻底告别背诵记忆

下期预告

下一篇我们攻克Spring最大难点、面试终极压轴题三级缓存彻底解决Bean循环依赖源码全解!全网最通俗拆解,搞定90%程序员搞不懂的循环依赖原理!

💡 往期推荐 & 系列连载

本系列持续更新,全程干货无水文,关注我,带你从零吃透Spring源码,彻底搞定面试底层原理!

http://www.rkmt.cn/news/1448166.html

相关文章:

  • 温州自动化设备限位板厂家推荐哪家靠谱?120家客户真实反馈告诉你答案(2026年6月最新) - 商业新知
  • 2026深圳越南专线高性价比物流服务商推荐指南 - 资讯速览
  • 如何从零开始构建足球视频智能分析系统
  • 如何实现专业级游戏瞄准辅助:开源AI解决方案深度解析
  • 2026年12家GEO品牌服务榜 - 博客万
  • 5分钟快速上手Path of Building PoE2:流放之路2角色规划终极指南
  • 上海配眼镜攻略。蔡司眼镜怎么选? - 资讯速览
  • 多工具横向实测盘点: 7 款 AI 毕业论文工具,拆解不同学科论文落地选型逻辑
  • 类加载双亲委派机制是什么,如何打破它来应对面试题
  • 【Spring源码08】终极万字拆解:三级缓存如何完美解决Bean循环依赖(面试压轴必刷)
  • 循环综合案例(break和continue的学习)
  • 个税app截图生成器,模拟器带计算UI,php纯源码可以带源码
  • 基于树莓派与多传感器的智能信箱DIY:从硬件选型到Web服务全链路实践
  • 终极微信聊天记录导出方案:免费高效备份你的数字记忆
  • 扬州静奢风全屋定制2026,不喧嚣不网红这4家高定品牌最懂 - 高定
  • 携程任我行卡怎么回收?三种渠道全解析 - 圆圆收
  • 告别服务器运维!用uniCloud云函数5分钟搞定你的第一个API接口
  • 基于Kenji-X1与振动探头的远程设备健康监测实践
  • 2026年北京工业消杀与餐饮虫害防治深度指南:如何选择真正的专业PCO服务商 - 优质企业观察收录
  • 【踩坑记录】UTF-8 和 GBK 编码冲突导致代码全变?Git 为什么没有提示冲突?
  • 垃圾回收算法有哪些区别,复制与标记整理怎么选
  • 2026年进出口报关公司哪家好?行业服务能力深度解析 - 品牌排行榜
  • 微信3大自动回复,解放双手还能提升成交率
  • 2026广州翡翠回收全攻略:种水色工+避坑指南,合扬专业鉴定夺魁 - 合扬奢侈品交易中心
  • 3个月攻克408考研:我的高效学习笔记系统完整指南
  • 成都黄金回收性价比门店大比拼 2026|全城筛选,合扬脱颖而出 - 合扬奢侈品交易中心
  • 【AI+监控系统黄金组合】:Gartner 2024验证的3层架构模型首次公开
  • 云端教育工具赋能气候变化教学:从数据探究到科学思维培养
  • 2026年访客系统大揭秘:哪家技术强且性价比高?快来一探究竟! - 智能硬件-产品评测
  • 如何高效使用TMSpeech:Windows本地实时语音转文字完整指南