IOC工作流程是什么?

1:IOC容器的初始化,springboot启动的时候会把xml定义,@configuration @bean定义,@componet @service定义的BEAN进行解析,形成beandefinition。这里面包含了bean的定义和属性等信息。然后把这些bean注册到IOC容器中。保存到一个map集合里面。完成初始化。

IOC容器对这些定义和属性的维护是IOC机制的核心。

2:完成bean的依赖注入和初始化。BEAN初始化完成后就可以调用,通过@autowire等从IOC容器中获取这个BEAN的实例。(DI)

image

 

IOC(控制反转)和 DI(依赖注入)是紧密相关但**不是完全等同的概念**,它们更像是**整体思想与具体实现**的关系。

### 核心区别:
1. **IOC(控制反转)** - **设计思想/原则**
- 核心:将对象的创建、生命周期管理等控制权从程序代码中**反转**到外部容器(Spring容器)
- 比喻:传统方式是你自己造车(new对象),IOC是工厂给你造车,你只管用

2. **DI(依赖注入)** - **IOC的具体实现方式**
- 核心:容器通过**注入**(构造器、setter等)的方式建立对象间的依赖关系
- 是Spring实现IOC的主要技术手段

### 关系图解:
```
控制反转(IOC) ← 是一个设计原则

依赖注入(DI) ← 是实现IOC的一种主要方式

Spring容器配置 ← 实际落地(XML/注解/Java Config)
```

### 代码示例说明:
```java
// 没有IOC的传统方式
public class UserService {
private UserRepository repository = new UserRepositoryImpl(); // 自己控制依赖
}

// 使用IOC+DI的方式
@Component
public class UserService {
@Autowired // 依赖被注入
private UserRepository repository; // 控制权在Spring容器
}
```

### 实现IOC的其他方式(对比):
- **依赖查找(DL)**:主动从容器获取依赖(如JNDI查找)
```java
UserRepository repo = (UserRepository) context.lookup("userRepo");
```
- **依赖注入(DI)**:被动接收依赖(Spring主要采用的方式)
```java
@Autowired // 容器主动注入
private UserRepository repo;
```

### Spring中的具体体现:
| 特性 | IOC体现 | DI体现 |
|------|---------|--------|
| **对象创建** | BeanFactory管理Bean生命周期 | @Bean, @Component创建对象 |
| **依赖管理** | 容器控制对象间关系 | @Autowired, @Resource注入依赖 |
| **配置方式** | XML/Java Config定义控制规则 | 注解指定如何注入 |

### 关键要点:
1. **IOC是目标**:让程序代码不再负责对象的控制
2. **DI是手段**:通过注入实现控制反转
3. **Spring框架**:通过DI完整实现了IOC思想

### 一句话总结:
**IOC是“做什么”(转移控制权),DI是“怎么做”(通过注入实现)**。在Spring中我们通常说“IOC容器通过DI管理Bean”,两者结合构成了Spring的核心机制。

这种设计降低了耦合度,提高了代码的可测试性和可维护性,是现代Java开发的基础模式。

posted @ 2026-01-12 21:33  人在代码在  阅读(2)  评论(0)    收藏  举报