首页 > 解决方案 > 控制反转、依赖反转原理和依赖注入是如何关联的?

问题描述

我知道使用依赖注入/服务定位器设计模式/等。我们正在实现控制反转。但是依赖倒置原则适用于哪里?还是与这两个完全分开?

  1. 我们是否也使用 DIP 来实现 IOC?
  2. DIP 是否与 IOC 或 DI 有关?

标签: design-patternsdesign-principles

解决方案


例如,如果 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。

这回答了你的问题了吗?


推荐阅读