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的目标吗?
依赖注入不是关于接口或类或枚举或...它是关于控制反转.
想象一下下面的课程.
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
.
归档时间: |
|
查看次数: |
2209 次 |
最近记录: |