【发布时间】: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;
...
}
}
该构造函数中将有许多组件。这样,我可以通过以下方式构造ComponentUI
做new 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