spring IoC思想概述
IoC(Inversion of Control,控制反转)是 Spring Framework 的核心设计思想之一,本质是:对象的创建与依赖关系的管理,从程序员手中转移到容器中(Spring容器)。
传统开发模式(控制未反转)
1 | class UserService { |
问题:
- 依赖关系写死(硬编码)
- 无法灵活替换实现
- 测试困难(无法Mock)
- 不符合面向接口编程
IoC 模式(控制反转)
1 | class UserService { |
变化本质:
| 项目 | 传统方式 | IoC方式 |
|---|---|---|
| 对象创建 | 自己 new | 容器创建 |
| 依赖关系 | 硬编码 | 配置/注入 |
| 控制权 | 程序控制 | 容器控制 |
IoC 核心机制
IoC 在 Spring 中通过两个核心组件实现:
1.IoC 容器(BeanFactory / ApplicationContext)
负责:
- 创建对象(Bean)
- 管理生命周期
- 维护依赖关系
常见容器:
BeanFactory(基础容器)ApplicationContext(增强容器,企业级使用)
2.2 依赖注入(DI,Dependency Injection)
IoC 的具体实现方式是 DI(依赖注入)
三种注入方式:
- 构造器注入(推荐)
- Setter 注入
- 字段注入(@Autowired)
1 |
|
IoC 工作流程(容器启动机制)
flowchart TD
A[加载配置/扫描注解] --> B[解析Bean定义]
B --> C[实例化Bean]
C --> D[依赖注入]
D --> E[初始化Bean]
E --> F[放入容器缓存]
F --> G[应用程序获取Bean]
关键阶段说明:
| 阶段 | 说明 |
|---|---|
| BeanDefinition | Bean 元数据描述 |
| 实例化 | 反射创建对象 |
| 依赖注入 | 自动装配 |
| 初始化 | 执行 init 方法 |
| 缓存 | 单例池 |
IoC 设计思想本质
控制反转的“反”是什么?
反的是“控制权”
- 原来:程序员控制对象创建
- 现在:容器控制对象创建
核心目标
- 解耦(Decoupling)
- 可扩展(Extensibility)
- 可测试(Testability)
- 可维护(Maintainability)
IoC 在 Spring 中的体现
XML 配置(早期)
1 | <bean id="userDao" class="com.demo.UserDao"/> |
注解方式(主流)
1 |
|
IoC 深层理解
本质是一个对象工厂 + 依赖图管理器
可以抽象为:
1 | IoC Container = |
与SRE/DevOps类比
| IoC | 云原生 |
|---|---|
| Bean | Pod |
| 容器 | Kubernetes |
| 注入依赖 | Service Discovery |
| 生命周期 | Pod Lifecycle |
本质一致:调度 + 生命周期管理 + 解耦