【问题标题】:Why Use Spring's Dependency Injection Over Regular Dependency Injection?为什么使用 Spring 的依赖注入而不是常规依赖注入?
【发布时间】:2021-02-24 19:22:51
【问题描述】:

我刚从 Java 背景学习 Spring。我理解的依赖注入是 您提供它的依赖项的对象,而不是初始化它自己的依赖项的对象。例如:

/*
   MyObj depends on HashMap as a dependency.
 */
public class MyObj {
  private HashMap hashmap;

  public MyObj() {
    this.hashmap = new HashMap();
  }
}

您不这样做,而是通过构造函数提供HashMap

/*
   MyObj depeneds on HashMap as a dependency.
 */
public class MyObj {
  private HashMap hashmap;

  public MyObj(HashMap hashmap) {
    this.hashmap = hashmap;
  }
}

这就是我认为的依赖注入。但在我看来,Spring 的做法是更多的代码 而且更混乱。在Spring中,你必须有这个单独的方法????

@Bean
public HashMap hashmap() {
  return new HashMap();
}

然后使用ApplicationContext.getBean(MyObj.class) 构造MyObj 对象。但是,我发现很多问题 用这种方法。首先,在 Swing 应用程序中,这是我将如何初始化组件 ui tree maker:

public class ComponentUI {
  public ComponentUI(JFrame frame, JPanel panel, ...) {
    this.frame = frame;
    this.panel = panel;
    ...
  }
}

该构造函数中将有许多组件。这样,我可以通过以下方式构造ComponentUInew ComponentUI(...) 并传入组件。但是,对于 Spring,我必须有一个单独的 每个方法。这需要大量的空间和大量的时间来制作每种方法。但是问题 我发现更糟糕的是,如果构造函数中有两个JPanel,那么你必须创建两个 扩展 JPanel 的单独对象。让我告诉你我的意思:

public class ComponentUI {
  public ComponentUI(..., JPanel panel1, JPanel panel2, ...) {
    ...
    this.panel1 = panel1;
    this.panel2 = panel2;
    ...
  }
}

对于 Spring,我不能这样做:

@Bean
public JPanel panel1() {
  ...
}

@Bean
public JPanel panel2() {
  ...
}

否则会有两个方法返回同一个对象,所以 Spring 不知道使用哪一个。 相反,我必须创建自己的从JPanel 派生的对象,然后在任何地方使用它。在我的 Swing 应用程序,我有一整套从其他组件派生的组件文件夹。

考虑到这些不便,我为什么要使用 Spring 的依赖注入而不是常规依赖 注入,即构造对象并提供对象。

【问题讨论】:

  • 这些都是非常糟糕的依赖注入示例。一方面,您不会使用依赖注入来初始化HashMap。也许如果您阅读了一些关于 Spring 的教程,并查看了它们使用的示例,您就会更好地了解 Spring 依赖注入的用途。
  • @Andreas 是的,我猜HashMap 是一个非常糟糕的例子,只是出于某种原因,这是我脑海中第一个蹦出来的东西。

标签: java spring spring-boot dependency-injection


【解决方案1】:

Spring 依赖注入比您所展示的更多。当您尝试自己解决现实世界的问题时,您会看到痛苦,然后会体会到 Spring 依赖的好处,我敢打赌,您很快就会开始使用 Spring。

我并不是说你必须使用 spring DI,但它会让你的生活更轻松。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 2012-12-23
    • 1970-01-01
    相关资源
    最近更新 更多