为什么建议为Spring bean使用接口?

时间:2018-10-23 05:46:18

标签: spring

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

示例:

Class Car{
    @Autowired
    private IEngine engine;
}

Class Engine{}

Interface IEngine{}

vs

Class Car{
    @Autowired
    private Engine engine;
}

Class Engine{}

3 个答案:

答案 0 :(得分:2)

好吧,这是 Spring概念设计者喜欢接口的概念。名义上的用例是将bean定义为具体类,并通过接口使用它。您可以将Bean与它的具体类一起使用,并且可以在绝大多数用例中使用,但是有时会导致更复杂的实现。

一个示例是您使用数据库的方式。从数据库读取或写入数据库的(业务层)类应仅使用接口。这样,您可以更改为其他数据库,而无需更改业务类中的单个字符。可以将其概括为任何类型的重构:带接口的Spring允许您更改Bean实现,而无需更改其调用程序中的任何内容。

另一个示例是Spring AOP。如果使用接口,那么这很容易,因为JDK代理就足够了。如果要使用具体的类,则必须使用 patcher 在加载或运行时修改该类。可能需要代理商...

长话短说,如果需要,您可以 使用具体的类,但是如果您使用接口,则Spring的用法会更流畅。

答案 1 :(得分:0)

许多原因:

  1. 您将有机会extends在其他地方上课 实现

  2. 一个bean本身可以有很多实现。校验 @Primary注解。您会得到更多的想法

更简单的是abstraction,这是Java的一个很好的功能。

没有人阻止您使用具体的类而不是接口,spring的工作方式与我们使用接口的方式相同。

答案 2 :(得分:0)

要记住的重要一点是,Spring希望能够在需要时以一种对应用程序透明的方式来装饰bean。如果您定义实现接口的bean,然后通过接口引用它们,则Spring可以将bean实现创建为类的包装器,仍然实现您的接口,并且代码不会受到影响。 Spring使用的默认实现就是基于这个想法。

Spring还可以通过扩展类或在加载时操纵类的字节码来实现bean,在这种情况下,您真正​​需要的就是POJO类。但是配置这些替代方法更加复杂。