Spring 启动到底干了什么?一文讲清 Bean 创建 + 依赖注入全过程

张开发
2026/4/17 6:09:15 15 分钟阅读

分享文章

Spring 启动到底干了什么?一文讲清 Bean 创建 + 依赖注入全过程
一、前言很多人学 Spring都会有这种感觉Autowired为什么能自动注入Component为什么不用newBean又是干嘛的看起来像“魔法”但本质其实非常简单❗ Spring 启动时只做两件事1. 创建对象Bean2. 组装对象之间的关系依赖注入本文用一套完整流程把这两件事彻底讲清楚。二、Spring 启动全流程核心图Spring Boot 启动 ↓ 扫描包ComponentScan ↓ 发现组件 Component / Service / Controller / Repository Configuration ↓ 创建 Bean对象 方式1类级别 → 自动 new 方式2方法级别 → Bean 调用方法 ↓ 放入容器Map结构 ↓ 依赖注入Autowired ↓ 按类型查找 Bean ↓ 注入到目标对象 ↓ 执行特殊接口CommandLineRunner ↓ 应用启动完成三、第一阶段Bean 是怎么创建的Spring 在启动时会先扫描两类来源1. 类级组件自动扫描Service public class UserService {} Controller public class UserController {}包括ComponentServiceControllerRepository 本质Spring 自动 new 对象 → 放入容器2. 配置类手动定义Configuration public class AppConfig { Bean public UserService userService() { return new UserService(); } } 本质Spring 调用 Bean 方法 → 获取返回值 → 放入容器⭐ 核心总结Bean 创建有两种方式 1️⃣ 自动创建类级别 Component / Service / Controller → Spring 自动实例化 2️⃣ 手动定义方法级别 Configuration Bean → Spring 调用方法获取对象⭐ 补充说明非常关键Service / Controller 本质都是 Component 的扩展 只是语义不同在 Bean 创建阶段没有本质区别。Bean 必须在 Configuration 类中 否则不会被 Spring 正确处理。四、Spring 容器是什么当所有 Bean 创建完成后会放入一个“容器”中。你可以把它理解成MapString, Object例如userService → UserService对象 userController → UserController对象 dataSource → 数据源对象五、第二阶段Autowired 是怎么工作的示例代码Service public class UserService { Autowired private OrderService orderService; }Spring 实际做的事情1. 创建 OrderService 2. 创建 UserService 3. 发现 Autowired 4. 按类型查找 OrderService 5. 找到后注入等价于你手写OrderService orderService new OrderService(); UserService userService new UserService(); userService.orderService orderService; 只是 Spring 帮你做了。⭐ 注入流程总结发现 Autowired → 按类型查找 Bean → 找到匹配对象 → 注入赋值❗ 常见情况1. 找不到 BeanNo qualifying bean of type xxx 说明容器里没有这个对象2. 找到多个 BeanNoUniqueBeanDefinitionException Spring 不知道选哪个六、结合真实项目理解在实际项目中比如Component public class DbCheckRunner implements CommandLineRunner { Autowired private DataSource dataSource; }Spring 启动时创建 DataSource → 创建 DbCheckRunner → 注入 DataSource → 执行 run() 这就是Bean创建 依赖注入 启动扩展点执行七、终极总结一定要记住Spring 本质只做两件事 1. 管理对象Bean 2. 组装对象关系依赖注入八、一句话理解 Spring❗ Spring “对象仓库 自动连线系统”仓库存所有对象Bean连线把对象之间关系自动组装九、写在最后理解了这套流程之后你会发现Autowired不再神秘Component不再抽象Bean也只是另一种创建方式后面无论是MyBatis事务TransactionalAOP本质都建立在这套机制之上。

更多文章