没有接口使用弹簧DI是否正确

Ank*_*pta 5 java spring dependency-injection interface

我正在使用spring依赖注入,我可以通过一些外部xml文件注入对象依赖.

我的问题是:

没有使用接口可以使用弹簧DI吗?

因为使用DI,我们希望实现一件事:

如果某个类被其他具有相同方法但定义不同的类替换,那么我们不需要在引用此类的代码中进行任何更改.

这很好,如果我使用接口,因为接口可以指向实现此接口的任何类,但如果我通过DI直接注入类对象然后没有DI的意义,因为在这种情况下,如果类被替换,我必须更改我的代码也被引用的地方.

如果出现问题,请让我纠正.

让我说我有

Class Datasource{

    String url;
    String user;
    String database;

}
Run Code Online (Sandbox Code Playgroud)

现在我在没有DI的情况下使用它

Class Abc{

     Datasource datasource = new Datasource();
}
Run Code Online (Sandbox Code Playgroud)

这有什么问题,如果我使用DI,我可以得到什么好处.

获得单身对象只是DI的目标吗?

M. *_*num 6

依赖注入不是关于接口或类或枚举或...它是关于控制反转.

想象一下下面的课程.

public class PersonService {

    private PersonRepository repository = new PersonRepository();
}
Run Code Online (Sandbox Code Playgroud)

显然这并没有错.但是,如果PersonRepository需要其他依赖项,如果它需要另一个复杂对象作为构造参数.突然间,这PersonService是关于如何构造一个对象及其所有依赖关系的逻辑.而它只想使用该对象.

public class PersonService {

    private PersonRepository repository;

    public PersonService() {
         InitialContext ctx = new InitialContext();
         repository = ctx.lookup("java:comp/env/repositories/person");
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码与JNDI相关联,您将如何测试它(很容易)当然您可以构建自己的Mock JNDI服务并使用构建或模拟的存储库预配置,但这非常麻烦.

 public class PersonService {

      private final PersonRepository repository;
      public PersonService(PersonRepository repository) {
          this.repository=repository;
      }
 }
Run Code Online (Sandbox Code Playgroud)

上面说的一切基本上都是可能的,PersonService关于如何构造PersonRepository它没有任何问题,它只是交给它,它来自哪个无关紧要.它是实际的类还是(基于类的)代理,是不关心的.

因此,依赖注入,你想要PersonRepository使用PersonService它来对它来说应该无关紧要,它是如何构造的,或者它是否是实际对象的代理.它只需要一个PersonRepository.

  • 它不仅仅是关于责任的简单性......`PersonService`的责任不是构造它所需的引用对象.只需将它们交给对象即可. (2认同)