拒绝死记硬背!用“程序员入职大戏”秒懂 Spring Bean 生命周期

摘要: 每次搜 Spring Bean 生命周期,总是被满屏的源码、复杂的流程图和几十个后置处理器(PostProcessor)绕得头晕眼花?背了忘,忘了背?今天,我们彻底抛弃那些冰冷的源码词汇,把 Spring 容器当成一家互联网公司,把 Bean 当成一个刚发了 Offer 的程序员。看懂了这场“入职大戏”,你这辈子都不会再忘掉 Bean 的生命周期!

很多兄弟在面试时,面对“请描述一下 Spring Bean 的生命周期”这道必考题,往往只能干瘪地背出几个名词。

其实,如果你扒开源码的外衣,Spring Bean 的一生极其符合人类社会的逻辑。它的宏观生命周期只有极其简单的 4 步:实例化 ➔ 属性赋值 ➔ 初始化 ➔ 销毁。

为了让你秒懂其中的精妙设计,我们直接把代码映射到真实的职场场景:假设你写了一个 OrderService,现在项目启动,这个 Bean 马上要去 Spring 容器“入职”了。


🎬 第一阶段:实例化 (Instantiation) —— 【HR 发 Offer,肉身到公司】

这是生命周期的绝对起点。

  • 底层动作: Spring 底层通过反射机制,调用了你的构造函数,执行了 new OrderService(),在堆内存里开辟了一块空间。
  • 日常开发: 你在类头上打了一个 @Service@Component 注解。Spring 扫描到之后,赶紧把你这个人招了进来。
  • 当前状态: 此时的你,只是个刚踏入公司的“纯肉身”。没分配电脑、没分配工位、不知道干啥。你类里面写的那些依赖对象(比如 UserMapper),全都是 null

💻 第二阶段:属性赋值 (Populate Properties) —— 【领电脑、分工位、连 Wi-Fi】

光有人不行,还得配干活的家伙事儿。房子有了框架,现在得拉网线。

  • 底层动作: 这就是大名鼎鼎的依赖注入(DI),Spring 开始解析并填充对象的属性。
  • 日常开发:
    • 你每天写得最多的 @Autowired@Resource,就是在这个阶段生效的。Spring 发现你需要用到 UserMapper,赶紧去仓库(单例池)里拿一个塞给你(给你分配工作用的电脑)。
    • 还有你用的 @Value("${server.port}"),Spring 也是在这时候去配置文件里把值读出来塞给你(告诉你公司的 Wi-Fi 密码)。
  • 当前状态: 装备齐全,随时可以写代码了。

🎓 第三阶段:初始化 (Initialization) —— 【岗前培训与换上官方马甲】

高能预警!这是整个生命周期戏份最重、面试官最爱挖坑的地方!
装备领完了,但在正式让你接业务之前,公司必须对你进行一系列的培训和包装。这个阶段分为 4 个精细的小步骤:

1. Aware 接口回调 —— 【发员工手册:认清公司大门】

有时候你在 Service 里无法直接 @Autowired 某个特殊的 Bean,你想手动去 Spring 容器里抓。你可以让这个类实现 ApplicationContextAware 接口。

  • 实际意义: HR 给你发了一本《员工手册》。通过这个接口,Spring 把**公司总部(ApplicationContext 容器对象本身)**的钥匙交到了你手里。以后你想找谁,自己用 context.getBean() 去抓。
2. 前置处理(@PostConstruct) —— 【开荒保洁:个人电脑预热】

很多时候我们需要:“项目一启动,立刻把字典表加载到 Redis 里”。你肯定会写一个 init() 方法并打上 @PostConstruct 注解。

  • 面试官常问:为什么不在第一步的构造函数里做这件事?
  • 神级回答: 因为在构造函数阶段(刚进门),我的 RedisTemplate 还没被 @Autowired 发下来啊!是个 Null!必须等到第二阶段(领完电脑)之后,@PostConstruct 才能正式干活。这就好比:电脑刚发下来,正式干活前,你自己得先装个 IDEA 压压惊。
3. 执行初始化方法 —— 【主管验收:不合格不准接客】

让类实现 InitializingBean 接口,重写 afterPropertiesSet() 方法。

  • 实际意义: 主管来验收你的工位配好没。你在这个方法里写一句防御性代码:if(redisTemplate == null) throw new Exception("没给我配 Redis,我不干了!")。如果有问题,直接抛异常阻断整个 Spring 项目的启动。绝不带着隐患上线。
4. 后置处理(AOP 织入) —— 【签保密协议,穿上官方马甲】
  • 日常开发: 你在这个类上打了一个 @Transactional(事务注解),或者写了个日志切面 @Aspect 拦截了它。
  • 实际意义: 你培训完了,马上要接业务了。但公司规定,涉及数据库操作的业务必须“签保密协议并留痕”。于是,公司法务部(AOP 后置处理器)出马了,他们连夜赶制了一个你的替身机器人(Proxy 代理对象)
  • 最终结果: 从今往后,外界以为在调用你,其实是在调用那个机器人。机器人会在执行你的代码前后,自动开启和提交事务。最终放入 Spring 单例池(工位)让你接客的,是这个穿了马甲的代理替身,而不是原生裸奔的你!

👋 第四阶段:销毁 (Destruction) —— 【提离职,优雅交接】

天下没有不散的宴席,项目总有停机更新的时候。

  • 底层动作: Spring 容器关闭(比如 JVM 收到 Kill 信号)。
  • 日常开发: 你在某个清理资源的方法上打了 @PreDestroy 注解。
  • 实际意义: 员工要走了,不能拍拍屁股直接走人。你要在这个方法里做**“优雅停机”**:把你没跑完的线程池优雅关闭(shutdown)、把没断开的 TCP 长连接断开、释放掉锁定的资源。结清工资,体面退群。

📝 极简复盘:入职大戏对照表

下次面试,当面试官问起 Spring Bean 生命周期,请在脑海中立刻浮现这张表:

阶段底层机制常用注解/接口入职大戏场景
1. 实例化反射 new 对象@Component / @Service发 Offer,肉身进门
2. 属性赋值依赖注入 (DI)@Autowired / @Value发电脑,分工位,连 Wi-Fi
3. 初始化Aware 回调ApplicationContextAware发员工手册,获取公司钥匙
前置处理@PostConstruct电脑到手,先装 IDEA (加载缓存)
初始化方法InitializingBean主管验收,缺少依赖直接抛异常
后置处理AOP / @Transactional造替身机器人,穿上官方马甲代理
4. 销毁容器关闭回调@PreDestroy离职交接,优雅停机,释放资源

总结: 源码再复杂,终究是为人服务的。把生涩的技术概念还原成生活常识,你会发现 Spring 框架的设计简直就像齿轮一样严丝合缝、美妙绝伦。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐