发布时间:2026/8/17 21:21:23
【Spring框架学习(三)】:Spring Bean生命周期源码解析 Spring框架学习系列《Spring框架学习一从设计思想到核心架构全面认识Spring》《Spring框架学习二IOC核心原理解析为什么Autowired可以自动注入》《Spring框架学习三Spring Bean生命周期详解》《Spring框架学习四Spring AOP动态代理实现原理》《Spring框架学习五Spring MVC请求处理流程解析》《Spring框架学习六Spring事务实现原理》《Spring框架学习七Spring Boot自动配置原理》《Spring框架学习八Spring源码整体流程总结》一、前言在上一篇文章中我们学习了 Spring IOC 的核心原理。我们知道Spring 会通过 IOC 容器管理对象。一个普通 Java 类Service public class UserService { }经过 Spring 管理后就成为了一个 Bean。但是一个问题随之而来Spring 中的 Bean 到底是如何创建出来的从类被扫描到对象被使用中间经历了哪些过程例如Autowired private UserDao userDao;为什么 Spring 可以自动完成注入例如PostConstruct public void init(){ }为什么这个方法会自动执行这些问题都和 Bean 生命周期有关。本文将从源码流程和实际开发角度分析 Spring Bean 从创建到销毁的完整过程。二、什么是Bean生命周期Bean生命周期指的是一个 Bean 从被 Spring 创建到最终销毁所经历的整个过程。简单流程BeanDefinition ↓ 实例化 ↓ 属性注入 ↓ 初始化 ↓ 使用 ↓ 销毁Spring 对 Bean 的管理本质就是对这个生命周期进行控制。三、Bean生命周期整体流程Spring Bean 完整生命周期1. 实例化 Bean ↓ 2. 属性填充 ↓ 3. Aware接口回调 ↓ 4. BeanPostProcessor前置处理 ↓ 5. 初始化方法执行 ↓ 6. BeanPostProcessor后置处理 ↓ 7. Bean投入使用 ↓ 8. Bean销毁其中最重要的几个阶段实例化依赖注入初始化后置处理器四、第一步实例化Bean4.1 什么是实例化实例化就是创建对象。例如Java中UserService userService new UserService();Spring底层也是类似过程。4.2 Spring源码入口Bean创建核心类AbstractAutowireCapableBeanFactory核心方法createBean()调用doCreateBean()流程createBean() ↓ doCreateBean() ↓ createBeanInstance() ↓ 反射创建对象最终Spring通过反射创建Bean实例。五、第二步属性注入对象创建完成后Spring需要给对象中的属性赋值。例如Service public class UserService { Autowired private UserDao userDao; }此时UserService已经创建。但是userDao还是空。Spring接下来进行属性填充。5.1 属性注入源码核心方法populateBean()作用填充 Bean 属性。其中InstantiationAwareBeanPostProcessor会参与处理。而AutowiredAnnotationBeanPostProcessor就是其中一个重要实现。5.2 Autowired执行过程流程创建UserService ↓ 发现Autowired ↓ 寻找UserDao Bean ↓ 反射赋值 ↓ 完成依赖注入最终效果userService.userDao userDao;六、第三步Aware接口回调Spring提供了一系列Aware接口。作用让 Bean 获取 Spring 容器中的一些信息。常见接口接口作用BeanNameAware获取Bean名称BeanFactoryAware获取BeanFactoryApplicationContextAware获取ApplicationContext例如Component public class MyBean implements ApplicationContextAware { private ApplicationContext context; Override public void setApplicationContext( ApplicationContext applicationContext){ this.context applicationContext; } }执行过程中Spring会主动调用setApplicationContext()把容器对象传入。七、第四步BeanPostProcessor前置处理BeanPostProcessor中文Bean后置处理器。它是 Spring 提供的重要扩展机制。接口public interface BeanPostProcessor { Object postProcessBeforeInitialization( Object bean, String beanName); }作用在 Bean 初始化之前执行。例如Spring AOP就是基于这个机制实现的。执行流程创建Bean ↓ 属性注入 ↓ BeanPostProcessor前置处理 ↓ 初始化八、第五步初始化Bean初始化阶段Spring会执行各种初始化方法。主要有三种方式。8.1 PostConstruct最常见方式。代码Component public class UserService { PostConstruct public void init(){ System.out.println( 初始化完成); } }Bean创建完成后自动执行。8.2 InitializingBean接口实现public interface InitializingBean { void afterPropertiesSet(); }例如Component public class UserService implements InitializingBean { Override public void afterPropertiesSet(){ System.out.println(初始化); } }8.3 init-method配置初始化方法。例如Bean(initMethodinit) public UserService userService(){ return new UserService(); }九、第六步BeanPostProcessor后置处理初始化完成后Spring再次调用postProcessAfterInitialization()流程初始化 ↓ BeanPostProcessor后置处理 ↓ 返回最终Bean为什么需要这一步因为很多 Spring 功能依赖它。例如AOP代理对象创建例如Transactional public void save(){ }Spring不会直接返回原对象。而是原始Bean ↓ AOP增强 ↓ 代理Bean所以我们最终拿到的对象可能不是原始对象。十、单例Bean如何保存Spring默认Bean作用域singleton。也就是一个容器只有一个对象。Spring通过DefaultSingletonBeanRegistry保存。核心singletonObjects结构MapString,Object例如userService ↓ UserService对象以后再次获取直接从缓存返回。十一、Bean销毁阶段当 Spring 容器关闭时Bean会进入销毁阶段。例如关闭context.close();Spring会执行销毁方法。11.1 PreDestroy常用方式Component public class UserService { PreDestroy public void destroy(){ System.out.println( Bean销毁); } }11.2 DisposableBean实现public interface DisposableBean{ void destroy(); }十二、完整生命周期总结Spring Bean完整流程BeanDefinition ↓ 实例化 ↓ 属性注入 ↓ Aware接口 ↓ BeanPostProcessor前置 ↓ 初始化方法 ↓ BeanPostProcessor后置 ↓ 生成最终Bean ↓ 对象使用 ↓ 销毁十三、Bean生命周期中的核心扩展点Spring为什么设计这么复杂因为它需要提供扩展能力。其中最重要的是BeanPostProcessor它允许开发者在 Bean 创建过程中插入自己的逻辑。例如AOP自动代理注解处理事务增强很多 Spring 高级功能都建立在这个机制之上。十四、总结Spring Bean 生命周期本质就是Spring 如何控制一个对象从出生到消失。核心过程创建对象 ↓ 注入依赖 ↓ 执行初始化 ↓ 增强处理 ↓ 投入使用 ↓ 销毁资源理解 Bean 生命周期后就能真正理解为什么Autowired可以自动注入为什么PostConstruct会自动执行为什么Transactional需要代理为什么Spring可以扩展各种功能下一篇文章将继续深入《Spring框架学习四Spring AOP动态代理实现原理》从代理对象创建、JDK动态代理、CGLIB代理三个方面分析 Spring 如何实现面向切面编程。

相关新闻

2026/8/17 23:32:03

Android游戏开发实战:从零复刻抖音潜艇大挑战,打造面试作品集

1. 项目概述:从“玩”到“造”的面试破局之路 “Android-手撸抖音‘潜艇大挑战’,非科班面试之旅”这个标题,精准地戳中了很多想转行或入行移动开发的朋友的痛点。它不是一个简单的游戏复刻教程,而是一个完整的、以项目驱动学习的…

2026/8/17 23:32:03

引射器工程计算进阶:物性处理、损失系数与迭代策略实战解析

1. 项目概述:从“算得对”到“算得好”的进阶上次我们聊了低压低速引射器的基础计算,把核心的动量方程、能量方程和连续性方程过了一遍,算是把“怎么算”的架子搭起来了。但说实话,那只是入门,是让你知道每个零件长什么…

2026/8/17 23:32:03

ESXi 6.7虚拟共享磁盘配置与并发写入安全解决方案

1. 项目缘起:一个真实的集群部署困境最近在帮一个朋友的公司搭建一套小型的内部测试集群,用于模拟高可用(HA)和负载均衡场景。他们的硬件环境是基于一台老旧的服务器,上面跑着 VMware ESXi 6.7,计划在上面创…

2026/8/17 10:49:52

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/17 5:02:51

工业传感器与变送器详解:序章 从物理世界到工业数据

序章 从物理世界到工业数据 ——重新认识工业传感器与变送器 工业自动化系统正变得日益复杂。今天的工业现场早已不是简单的控制回路,而是由多层技术共同构成的立体体系:PLC、DCS、SCADA、MES、工业互联网、边缘计算与人工智能。控制系统可以执行复杂算法,工业网络可以实现…

2026/8/17 0:02:57

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必经之路如果你在LabVIEW里写过稍微复杂点的程序,尤其是涉及到界面响应、多任务并行或者硬件IO等待,大概率会遇到一个头疼的问题:程序“卡”住了。前面板点不动,进度条不更新…

2026/8/17 0:02:57

飞书局域网文件传输实战:3种方案实现高速点对点传输

1. 项目概述:为什么要在局域网内用飞书传文件? 飞书作为一款主流的协同办公套件,其核心功能是围绕云端协作设计的。无论是文档、表格还是文件,通常的分享逻辑都是“上传到云端 -> 生成链接 -> 分享给同事”。这个流程在互联…

2026/8/17 15:07:41

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/17 17:27:06

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/15 9:46:30

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…