java - 实现依赖注入(inject)困惑

标签 java dependency-injection inversion-of-control

我有三个主要类(class),比如说 A、B 和 C。 A 实例化 B 和 C。B 也依赖于 C。B 通过 setter/getter 方法访问 C 的对象。这可以。 我的问题是 A 的实现与 B 和 C 的实现紧密耦合。 我想把这个脱钩。 我不想使用spring框架。还有其他办法吗?我想过为他们的(B,C)初始化创建工厂,但这意味着每当A或C需要访问B时,他们都必须再次创建工厂的新实例..这似乎不对。 我应该如何解决这个问题? 不知道IOC容器在这里有用吗?

最佳答案

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 s,通过将这些依赖项注入(inject)它(因此,依赖项注入(inject))。

解耦A实现开始,您将需要为 B 的功能创建接口(interface)和CA关心。说,BableCable 。然后A可以接受 Bable 作为其构造函数参数和一个 Cable ,并且不关心哪个类实现这些接口(interface),或者实现如何工作——只是它符合 Bable 制定的契约。和Cable .

这是我正在讨论的一个完整的例子:https://gist.github.com/2402514

关于java - 实现依赖注入(inject)困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10183341/

相关文章:

java - 如何向具有静态方法的类提供参数而不更改其静态限定符?

symfony - 在 Symfony2 中,为什么注入(inject)服务容器而不是单个服务是一个坏主意?

java - 用于加密/解密属性文件中的密码的安全解决方案

java - Java 的 TrimEnd?

java - Spring Java 对象依赖注入(inject)

c# - IoC 和 ASP.NET MVC,一切从哪里开始?

c# - 使用 Unity IoC 进行 MVC 集成测试

java - 如何立即刷新AlertDialog的内容

java - 无法使用双击运行可执行 jar 文件

c# - Autofac 构造函数按属性注入(inject)