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

时间:2014-10-09 10:25:36

标签: java spring interface dependency-injection

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

我的问题是:

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

因为有了DI,我们想要实现一件事:

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

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

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

我们说我有

Class Datasource{

    String url;
    String user;
    String database;

}

现在我正在使用它而没有DI

Class Abc{

     Datasource datasource = new Datasource();
}

这是什么问题,如果我使用DI,我可以获得哪些好处。

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

1 个答案:

答案 0 :(得分:5)

依赖注入不是关于接口或类或枚举或......它大约是Inversion of Control

想象一下下面的课程。

public class PersonService {

    private PersonRepository repository = new PersonRepository();
}

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

public class PersonService {

    private PersonRepository repository;

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

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

 public class PersonService {

      private final PersonRepository repository;
      public PersonService(PersonRepository repository) {
          this.repository=repository;
      }
 }

以上所有内容基本上都是可能的,PersonService上没有任何关于如何构建PersonRepository的问题,它只是交给了一个,它来自它并不重要。它是实际的类还是(基于类的)代理,是不关心的。

因此,依赖注入,您希望将PersonRepository交给PersonService使用它不应该是它来自哪里,它是如何构造的,或者它是否是一个代理到一个实际的对象。它只需要一个PersonRepository