请求详解Dependency Inversion、DI与IoC三者的区别
Dependency Inversion、IoC与DI的核心区别及关联
1. 依赖倒置原则(Dependency Inversion Principle, DIP)
- 这是SOLID五大设计原则中的一条,属于设计准则/思想,核心规则:
- 高层业务模块不直接依赖低层实现模块,两者共同依赖抽象接口
- 抽象接口不依赖具体细节,具体细节实现依赖抽象接口
- 实际例子:订单支付模块(高层)不该直接绑定微信支付SDK(低层实现),而是依赖统一的
Payment抽象接口,微信支付实现这个接口即可。
2. 控制反转(Inversion of Control, IoC)
- 这是一种解耦设计思想,核心是反转对象的创建与依赖管理控制权:
- 传统开发模式中,开发者需要在代码里手动创建对象、管理依赖(比如A类依赖B类,A自己
new B()) - IoC模式下,对象创建、依赖关联的控制权交给第三方容器(比如Spring容器),开发者只需要定义对象和依赖关系
- 传统开发模式中,开发者需要在代码里手动创建对象、管理依赖(比如A类依赖B类,A自己
- 关于Spring文档将IoC等同于DI:这是因为DI是IoC最常用、最核心的实现方式,Spring以DI作为IoC的落地手段,所以文档里会直接将二者等同,但严格来说IoC是更宽泛的概念,还有服务定位器模式等其他实现方式。
3. 依赖注入(Dependency Injection, DI)
- 这是IoC思想的具体实现手段,核心是将依赖对象主动注入到目标对象中,而非让目标对象自行创建依赖:
- 主流注入方式:构造器注入、Setter方法注入、字段注入
- 例子:Spring容器先创建
Payment接口的微信支付实现类对象,再将这个对象注入到订单支付模块中,订单模块无需自己实例化支付对象,只需声明依赖。
三者的关联逻辑
- DIP是顶层设计指导,规定了模块间依赖关系的设计标准
- IoC是实现DIP的思想路径,通过反转控制权来达成模块解耦
- DI是IoC最主流的落地方式,Spring就是通过DI实现IoC,进而满足DIP的设计要求
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

