【问题标题】:Understanding DI in java [duplicate]了解Java中的DI [重复]
【发布时间】:2013-01-07 06:42:17
【问题描述】:

可能重复:
Understanding the need for a DI framework

我已经阅读了几篇文章,并就 DI 与几位专业人士进行了交谈。我不明白的是如何通过 DI 解耦对象。以下文章还描述了一个场景,但我不明白 Spring 如何帮助解耦 PayrollApplication?解耦是通过多态性而不是 DI 完成的。 DI 定义有其他用途...

http://www.developer.com/java/dependency-injection-in-existing-java-code.html

提示和参考都可以。谢谢

【问题讨论】:

  • 我的论点是我没有看到 DI 如何负责解耦。以前需要的对象现在也需要!
  • 解耦是在设计中进行的,DI与此无关。您可以在引用具体实现的对象上使用 DI,并且根本不会有任何解耦。当您依赖抽象类或接口时,您可以解耦不同的 bean,这允许您轻松切换不同的 impl。 DI 容器只是让您免于查找每个 bean 的不同实例并将它们注入所需的 bean 所需的所有麻烦。
  • 您引用的文章是解释依赖注入的一个非常糟糕的例子。您看不到依赖注入和服务定位之间的区别,也没有解释控制反转和依赖反转原则。

标签: java spring dependency-injection coding-style


【解决方案1】:

脱钩不是一个全有或全无的概念。在本文中,仅使用多态(“设计 2”)在一定程度上解耦了对象,但 PayrollApplication 类在编译 PayrollApplication 时仍然需要了解 Employee 的实现。

Employee 实现是 PayrollApplication 的依赖项,通过依赖注入可以实现更高级别的解耦:您可以编译 PayrollApplication 使其仅引用 Employee 接口,并提供 Employee 实现(可能由另一个团队编写/组织)仅在以后。

还可以查看Wikipedia 关于依赖注入:

依赖注入模式的主要目的是允许 在给定依赖项的多个实现中进行选择 在运行时或通过配置文件而不是在 编译时间。该模式对于提供存根特别有用 在测试时测试复杂组件的实现,但通常是 用于定位插件组件,或者定位和初始化 软件服务。

【讨论】:

    【解决方案2】:

    依赖注入解耦了对象,因为你没有直接实例化具体的类,Spring 正在为你做这件事。使用 DI 的替代方法是您通常会创建对接口的引用,但您仍然必须直接实例化对象。您的代码中仍然引用了 concreate 类。

    编辑:忘了提到您可以使用工厂模式将实现从您的代码中取出,但您只是将其移入工厂。 Spring 就像一个巨大的、所有 bean 的通用工厂。

    【讨论】:

    • 您不是在解释 DI,而是在解释控制反转。
    猜你喜欢
    • 2017-01-07
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2020-05-06
    • 2013-08-29
    • 2010-10-10
    • 2020-03-07
    • 2010-10-04
    相关资源
    最近更新 更多