“程序员入职大戏”秒懂 Spring Bean 生命周期
拒绝死记硬背!用“程序员入职大戏”秒懂 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 框架的设计简直就像齿轮一样严丝合缝、美妙绝伦。
更多推荐



所有评论(0)