控制反转 (IOC - Inversion of Control)
控制反转 是一种设计原则,它将对象创建和依赖关系的管理从应用程序代码中移交给框架或容器。它主要体现在以下两个方面:
- 创建对象的职责从应用程序代码转移到容器:应用程序不再负责创建和管理依赖对象,而是由容器负责。
- 依赖关系的管理从应用程序代码转移到容器:容器通过配置(如 XML 文件、注解)来管理依赖关系。
IOC 的优势
- 松耦合:组件之间通过接口进行交互,依赖关系通过容器注入,而不是直接创建和依赖具体实现。
- 可测试性:由于组件之间的松耦合,可以轻松地进行单元测试,使用模拟对象(Mock)替换实际依赖对象。
- 可维护性:所有依赖关系和对象创建逻辑都集中在配置文件或注解中,便于管理和维护。
Spring的IOC容器是一个用来管理和装配Bean(Spring应用中的组件)的容器,它负责创建对象、管理对象的生命周期以及对象之间的依赖关系。通过IOC容器,可以实现依赖注入。
依赖注入 (DI - Dependency Injection)
依赖注入 是实现 IoC 的一种设计模式,它通过将依赖对象注入到组件中来实现组件之间的松耦合。DI 是 IoC 的一种具体实现方式。
DI 的类型:
- 构造函数注入:通过构造函数参数传递依赖对象。
- 方法注入:通过方法参数传递依赖对象。
- 字段注入:通过字段(成员变量)注入依赖对象。
DI 实现方式
Spring 框架中,依赖注入可以通过注解或者 XML 配置来实现。
1. 构造函数注入
构造函数注入通过构造函数参数传递依赖对象。适用于依赖关系明确且依赖对象必须在对象创建时就存在的情况。
2. 方法注入
方法注入通过 setter 方法或自定义方法传递依赖对象。适用于依赖关系较为复杂且依赖对象可以在对象创建之后设置的情况。
3. 字段注入
字段注入直接通过类的成员变量注入依赖对象。使用最简便,但难以进行单元测试。