我正在使用spring依赖注入,我可以通过一些外部xml文件注入对象依赖。
我的问题是:
没有使用接口可以使用弹簧DI吗?
因为有了DI,我们想要实现一件事:
如果某个类被其他具有相同方法但定义不同的类替换,那么我们不需要对引用该类的代码进行任何更改。
这很好,如果我使用接口作为接口可以指向实现此接口的任何类,但如果我直接通过DI注入类对象然后没有DI的意义,因为在这种情况下如果类被替换,我有更改我的代码以及它被引用的位置。
如果出现问题,请让我纠正。
我们说我有
Class Datasource{
String url;
String user;
String database;
}
现在我正在使用它而没有DI
Class Abc{
Datasource datasource = new Datasource();
}
这是什么问题,如果我使用DI,我可以获得哪些好处。
获得单身对象只是DI的目标吗?
答案 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
。