Java 实现依赖注入混淆

Java 实现依赖注入混淆,java,dependency-injection,inversion-of-control,Java,Dependency Injection,Inversion Of Control,我有三个主要的班级,比如说A、B和C。 A同时实例化B和C。B还依赖于C。B通过setter/getter方法访问C的对象。这很好。 我的问题是A的实现与B和C的实现紧密耦合。 我想把它解耦。 我不想使用spring框架。还有别的办法吗?我曾想过为它们的(B,C)初始化创建工厂,但这意味着每当A或C需要访问B时,它们必须再次创建工厂的新实例。。这似乎不对。 我应该如何解决这个问题? 我不确定IOC容器在这里是否有用?A不应直接实例化B或C。它应该接受它们的实例作为构造函数参数: public c

我有三个主要的班级,比如说A、B和C。 A同时实例化B和C。B还依赖于C。B通过setter/getter方法访问C的对象。这很好。 我的问题是A的实现与B和C的实现紧密耦合。 我想把它解耦。 我不想使用spring框架。还有别的办法吗?我曾想过为它们的(B,C)初始化创建工厂,但这意味着每当A或C需要访问B时,它们必须再次创建工厂的新实例。。这似乎不对。 我应该如何解决这个问题?
我不确定IOC容器在这里是否有用?

A
不应直接实例化
B
C
。它应该接受它们的实例作为构造函数参数:

public class A
{
    private B b;
    private C c;

    public A(B b, C c)
    {
        this.b = b;
        this.c = c;
    }
}

// When creating your object graph, in the "composition root":
B b = new B();
C c = new C(b);
A a = new A(b, c);
这通过向
A
注入这些依赖项(因此称为依赖项注入),将
A
与实例化
B
s和
C
s的细节分离开来

要将
A
与实现分离,您需要为
A
关心的
B
C
功能创建接口。比如说,
Bable
Cable
。然后
A
可以接受一个
Bable
和一个
Cable
作为它的构造函数参数,而不关心发生了什么类来实现这些接口,或者实现是如何工作的——只要它符合
Bable
Cable
所规定的契约


下面是一个完全充实的示例,说明了我所说的内容:

您可以指定在构造函数中应该使用的具体对象,然后将它们存储为成员变量。这样,您不必多次创建对象,并且可以提供其他类的对象(例如,实现与B相同的接口)

对于C/CIface也是如此

像这样使用它:

BIface c = new C(); // or some other class also implementing CIface
BIface b = new B(c); // or some other class also implementing BIface
A a = new A(b, c);

这还不太清楚。为什么A与B和C的实现“紧密耦合”?你能展示一些简短的示例代码吗?我忘了提到,A是“主类”,是代码的驱动程序。如果我把B和C抽象出来,谁实际创建了实现?i、 e混凝土B(巴布)和C(电缆)的实例?那么,主类可以实例化这么多对象吗?您可以在“组合根”中创建具体实例。这通常是应用程序的入口点,即Java中的
main()
。我忘了提到,A是“主类”,是代码的驱动程序。如果我把B和C抽象出来,谁实际创建了实现?i、 e混凝土B(巴布)和C(电缆)的实例?那么,main类可以实例化这么多对象吗?您可以在
main()
方法中进行实例化。如果您可以轻松地传递所有需要的类,那么预先创建它们是完全可以的。
BIface c = new C(); // or some other class also implementing CIface
BIface b = new B(c); // or some other class also implementing BIface
A a = new A(b, c);