spring - 为什么推荐spring bean的接口(interface)?

标签 spring

我正在学习 Spring 并遇到了这个设计问题。我不确定如何解释它。在链接 bean 时,我是否应该始终使用接口(interface)而不是仅仅指向实际的实现?我想从 mock 的角度进行测试会变得更容易,但我应该教条地遵循它吗?即一个bean 应该总是引用另一个bean 的接口(interface)。

例子:

Class Car{
    @Autowired
    private IEngine engine;
}

Class Engine{}

Interface IEngine{}

对比
Class Car{
    @Autowired
    private Engine engine;
}

Class Engine{}

最佳答案

嗯,这是一种 Spring 概念者喜欢接口(interface)的概念。名义上的用例是将 bean 定义为具体类并通过接口(interface)使用它。您可以使用带有具体类的 bean,它适用于绝大多数用例,但有时会导致更复杂的实现。

一个例子是您使用数据库的方式。从数据库读取或写入数据库的(业务层)类应该只使用接口(interface)。这样您就可以更改到不同的数据库,而无需更改业务类中的单个字符。这可以推广到任何类型的重构:带有接口(interface)的 Spring 允许您更改 bean 实现而不更改其调用者中的任何内容。

另一个例子是 Spring AOP。如果你使用接口(interface),它会变得小菜一碟,因为 JDK 代理就足够了。如果要使用具体类,则必须使用修补程序在加载或运行时修改类。这可能需要代理...

长话短说,如果你愿意,你可以使用具体的类,但是如果你使用接口(interface),Spring 的使用会更顺畅。

关于spring - 为什么推荐spring bean的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52941912/

相关文章:

java - Service层异常处理

java - facescontext.getcurrentinstance 返回 nullpointerexception

java - Spring : Is this member variable thread-safe?

java - 如何正确地将对象(带有集合)绑定(bind)到Spring Forms?

xml - Spring Controller 无法返回 JSON

java - Ehcache-spring-annotations @Cacheable 没有捕获以 String 对象为参数的方法

java - 如何在Spring Tool Suite中找到Spring版本?

用于 API 的 Spring webflux 自定义身份验证

spring - 在生产服务器中部署时是否应该更改 mongo bean 的值?

java - Spring发送和获取文件的正确方式