实现依赖注入混淆

时间:2012-04-17 00:04:46

标签: java dependency-injection inversion-of-control

我有三个主要的课程,比如A,B和C. A实例化B和C. B也依赖于C.B通过setter / getter方法访问C的对象。这可以。 我的问题是A的实现与B和C的实现紧密结合。 我想解开这个。 我不想使用弹簧框架。还有其他方法吗?我想为他们的(B,C)初始化创建工厂,但这意味着每当A或C需要访问B时,他们必须再次创建一个新的Factory实例..这似乎不对。 我该怎么解决这个问题? 我不确定IOC容器在这里是否有用?

2 个答案:

答案 0 :(得分:1)

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

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与实例化BC的细节分离开来,方法是将它们注入这些依赖项(因此,依赖注入)。

要将A实现分离,您需要为BC A关注BableCable的功能创建接口关于。比方说,ABable。然后Cable可以接受BableCable的构造函数参数,而不关心实现这些接口的类是什么,或者实现如何工作 - 只是它符合{{1}}和{{1}}列出的合同。

以下是我所说的完全充实的例子:https://gist.github.com/2402514

答案 1 :(得分:0)

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

public class A
{
  private BIface b;
  private CIface c;
  public A(BIface b, CIface c) {
    this.b = b;
    this.c = c;
  }
}

interface BIface {
  // required B methods
}

public class B implments BIface
{
  // implement the interface
}

类似于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);
相关问题