在Spring框架中,DI(依赖注入)和IOC(控制反转)是两个核心概念,它们密切相关但有不同的侧重点。
IOC(控制反转)
IoC 是一种设计原则,将对象的创建和依赖管理交给框架或容器,而不是由开发者手动控制。传统方式下,对象自行管理依赖,而IoC将这一责任转移给外部容器,从而实现控制权的反转。
DI(依赖注入)
DI 是实现IoC的一种方式。它通过将对象的依赖关系从外部注入,而不是由对象自行创建或查找依赖。Spring框架通过以下几种方式实现DI:
- 构造函数注入:通过构造函数传递依赖。
- Setter注入:通过Setter方法设置依赖。
- 字段注入:通过反射直接注入字段(不推荐)。
关系
- IOC 是更广泛的概念,指的是将控制权交给外部容器。
- DI 是实现IoC的具体方式,通过注入依赖来管理对象间的关系。
示例
// 服务类
public class MyService {
private MyRepository repository;
// 构造函数注入
public MyService(MyRepository repository) {
this.repository = repository;
}
public void performService() {
repository.saveData();
}
}
// 仓库类
public class MyRepository {
public void saveData() {
System.out.println("Data saved");
}
}
// Spring配置类
@Configuration
public class AppConfig {
@Bean
public MyRepository myRepository() {
return new MyRepository();
}
@Bean
public MyService myService() {
return new MyService(myRepository());
}
}
在这个例子中,Spring容器负责创建和管理MyService
和MyRepository
的实例,并通过构造函数注入依赖关系。
总结
- IOC 是控制权的反转。
- DI 是实现IOC的具体方式,通过注入依赖来管理对象间的关系。
Spring通过DI机制实现了IOC,简化了对象的管理和依赖关系的处理。