design-patterns - 控制反转、依赖反转原理和依赖注入是如何关联的?
问题描述
我知道使用依赖注入/服务定位器设计模式/等。我们正在实现控制反转。但是依赖倒置原则适用于哪里?还是与这两个完全分开?
- 我们是否也使用 DIP 来实现 IOC?
- DIP 是否与 IOC 或 DI 有关?
解决方案
例如,如果 A 类依赖于 B 类,则通过依赖倒置来重构它会导致 A 类依赖于 B 类实现的接口 B。
- 重构前: A类--->B类
- 重构后: A类--->接口B<---B类
简而言之,依赖倒置原则指出,您的高级抽象(例如 A 类)和低级抽象(例如 B 类)都不应依赖于具体的东西(因为 A 类在重构之前依赖于 B 类) ),但通过中间抽象层(接口 B 抽象)解耦。
依赖倒置被用作实现依赖注入的一种手段。例如,在春天,
interface AbstractB {
}
@Component
class ConcreteB implements AbstractB {
}
@Component
class ConcreteA {
@Autowired
// note reference type is AbstractB
private AbstractB concreteB;
}
- 通过依赖 ConcreteA 中 AbstractB 类型(而不是 ConcreteB)的引用,我们正在应用依赖反转。
- 通过使用 @Autowired 并让 Spring 为我们注入该依赖项(而不是使用 'new' 关键字自己实例化它),我们正在使用依赖项注入。
- 控制反转是允许外部框架(在此示例中为 Spring IoC 容器)实例化您的依赖项并将它们注入您的代码的原则。
关于“我们是否也使用 DIP 实现 IOC?”,在我看来,不一定,因为我们可以使用 ConcreteB 类型的参考自动装配,实现 IoC 和 DI,但违反 DIP。
这回答了你的问题了吗?
推荐阅读
- node.js - npm install web3 安装失败: undefined ls-remote
- r - rvest 刮取空表
- javascript - 切换禁用的文本输入 onclick
- python - 寻找 RSS 和 R-Squared
- android - 如果 Bluestacks App Player 上没有“启用 USB 调试”选项,如何使用 ADB?
- python - Ipython 在使用 sympy 绘图后冻结
- c - 即使未分配所有 scanf() 值也执行程序
- postgresql - PostgreSQL 安全本地 (pg_hba.conf )
- matlab - Matlab太多输入参数以及如何设置默认值
- java - setText firebase TimeStamp 到 Android 中的 TextView