当前位置: 首页 > 面试题库 >

什么是依赖注入?

邹举
2023-03-14
问题内容

已经发布了几个问题,其中包括有关依赖项注入的特定问题,例如何时使用它以及支持它的框架。然而,

什么是依赖项注入?何时/为什么/不应该使用它?


问题答案:

依赖注入 将依赖传递给其他 对象框架 (依赖注入器)。

依赖注入使测试更加容易。注入可以通过 构造函数 完成。

SomeClass() 其构造函数如下:

public SomeClass() {
    myObject = Factory.getObject();
}

问题 :如果myObject涉及复杂的任务,例如磁盘访问或网络访问,则 很难
对其进行单元测试SomeClass()。程序员必须进行模拟,myObject并可能 拦截 工厂调用。

替代解决方案

  • myObject作为参数传递给构造函数

    public SomeClass (MyClass myObject) {
    this.myObject = myObject;
    }

myObject 可以直接通过,这使测试更加容易。

  • 一种常见的替代方法是定义 空操作构造函数 。依赖注入可以通过设置器来完成。(h / t @MikeVella)。
  • Martin Fowler记录了第三种选择(h / t @MarcDix),其中 类显式实现了 程序员希望注入的依赖项 的接口

如果没有依赖注入,则很难在单元测试中隔离组件。

2013年,当我撰写此答案时,这是Google Testing
Blog的一个主要主题。这对我来说仍然是最大的优势,因为程序员在运行时设计中并不总是需要额外的灵活性(例如,对于服务定位器或类似的模式)。程序员在测试过程中经常需要隔离类。



 类似资料:
  • 考虑下面的代码: 上面的代码是一个表示一个汉堡包类。 该类假设汉堡包括Bun, Patty 和 Toppings。 该类还负责制作Bun, Patty 和 Toppings。 这是一件坏事。 如果需要素食汉堡怎么办? 一个天真的方法可能是: 好吧,这有点不同,它在某些方面更灵活,但它仍然相当脆弱。 如果Patty构造函数改变以允许新的功能会发生什么? 整个汉堡包类必须更新。 事实上,任何时候任何这

  • 问题内容: 我想知道 _什么是Spring Framework? 为什么和何时应该在Java Enterprise开发中使用它? _ 答案将是“依赖注入框架”。好了,使用依赖注入框架时我们有什么优势?用setter值和/或构造函数参数描述类的想法对我来说似乎很奇怪。为什么这样 因为我们可以更改属性而无需重新编译项目?这就是我们所获得的一切吗? 那么,我们应该用什么对象来描述?所有对象还是只有几个?

  • 问题内容: 对于Java,依赖注入作为纯OOP工作,即,您提供要实现的接口,并且在框架代码中接受实现已定义接口的类的实例。 现在,对于Python,您可以以相同的方式进行操作,但是对于Python,我认为该方法的开销太大。那么,您将如何以Pythonic的方式实现它呢? 用例 说这是框架代码: 基本方法 最幼稚(也许是最好的?)方法是要求将外部函数提供给构造函数,然后从该方法中调用它。 框架代码:

  • 借助Spring实现具有依赖关系的对象之间的解耦。 对象A运行需要对象B,由主动创建变为IOC容器注入,这便是控制反转。 获得依赖对象的过程被反转了,获取依赖对象的过程由自身创建变为由IOC容器注入,这便是依赖注入。

  • 问题内容: 我了解依赖注入本身的好处。让我们以Spring为例。我还了解其他Spring功能(如AOP,不同类型的助手等)的好处。我只是想知道XML配置的好处是什么,例如: 与普通的旧Java代码相比,例如: 它更容易调试,检查编译时间,并且仅懂Java的任何人都可以理解。那么,依赖注入框架的主要目的是什么?(或一段显示其优点的代码。) 如果 如果有多个,IoC框架如何猜测要注入的myServic

  • 我不太明白它解决了什么问题。它看起来像是这样说:“Hi.当你运行到这个函数时,返回一个对象,它是这种类型的,并且使用这些参数/数据。” 但是...我为什么要用这个?注我也从来不需要使用,但我理解这是为了什么。 在构建一个网站或桌面应用程序时,有哪些实际情况可以使用DI?我可以很容易地想出为什么有人想在游戏中使用接口/虚拟函数的例子,但是在非游戏代码中使用这种方法是极其罕见的(非常罕见,以至于我都记