首页 > 解决方案 > 两个简单类的上下文中的依赖注入

问题描述

我在掌握依赖注入时遇到了问题(或者让我说它的好处)。所以我决定写两段简单的代码,一段没有DI,另一段有DI。

所以我有一个A类

public class A {
    public void foo(){
        B b = new B();
        b.fooB();
    }
}

如上所示,A取决于B,B是

public class B {
    public void fooB(){
        Log.e("s", "y");
    }
}

我们可以使用 A like

public void do(){
    A a = new A();
    a.foo();
}

但是据说 A 不应该简单地初始化 B,因为它依赖于它,但是我们应该有一个在两个类之间有某种契约的服务。例如,如果我错了,请告诉我

所以让我们有一个接口 BService

public interface BService {
    void fooB();
}

B变成DiB

public class DiB implements BService {
    @Override
    public void fooB(){
        Log.e("s", "y");
    }
}

A变成DiA

public class DiA {
    BService bService;

    public DiA(BService bService){
        this.bService = bService;
    }

    public void foo(){
        bService.fooB();
    }
}

我们可以使用 A like

public void dIdo(){
        BService service = new diB();
        diA a = new diA(service);
        a.foo();
}

所以我读到 DI 的好处是:

两种代码似乎都可以正常工作,我无法理解其中一个的好处,只是另一个更复杂。那么,请您在这个简单的 A 类和 B 类的上下文中告诉我更多的好处。我没有得到什么?

标签: javadependencies

解决方案


首先,我不同意您的“据说A不应该简单地初始化B,因为它取决于它”..因为相同的代码在.NET中对我有用

    class Program
{
    static void Main(string[] args)
    {
        A aobj = new A();
        aobj.foo();
    }
}
public class A {
    public void foo()
    {
        B bojb = new B();
        bojb.fooB();
        Console.WriteLine("From A.foo() ..");
        Console.ReadLine();
    }

}
public class B {
    public void fooB()
    {
        Console.WriteLine("From B.fooB() ..");
        Console.ReadLine();
    }
}

除此之外,猜测您对依赖注入的基础知识感到困惑。依赖词本身传达了任何类的注入源。

  1. 首先,可以在类的实例期间识别依赖关系,并且构造函数是第一种类型。
  2. 其次,一旦对象被实例化,在我们调用任何方法之前,都会对属性或公共字段进行一些赋值。虽然它是可选的,但是,顺序是这样的。于是,第二种。
  3. 最后是方法注入。

建议您在制作案例之前阅读更多内容。


推荐阅读