java - SpringBoot 应用程序中的每个 @Service 类是否应该实现一个接口(interface)

标签 java spring spring-boot

嗨,Spring/SpringBoot 粉丝/专家,
希望你做得很好。我一直在努力解决这个问题,我想我会向 spring/springboot 专家询问他们的意见和经验。它是关于接口(interface)的,因为它与它在 springboot 中的使用有关。
首先让我说一下;从 Java 或软件工程的角度来看,我理解并非常清楚接口(interface)的用途或目的,它们是契约。
因此,从 springboot 作为 FRAMEWORK/library 的角度来看,它在框架源代码中是有意义的。
现在,从 springboot 作为一个 APPLICATION 我已经看到每个服务类(@Service)都有一个相应的接口(interface)的情况:

public interface MyService {} 
public class MyServiceImpl implement MyService {}
99.99% 的情况下,这些接口(interface)永远不会被其他任何东西实现。为什么这在 springboot 中变得如此流行,每个服务类都有一个相应的接口(interface),即使没有其他东西会实现这些接口(interface)?
对我来说,它似乎增加了维护的复杂性和代码,但没有明显的好处。请注意,我严格指的是 @Service仅类接口(interface)。
这样做是个好习惯吗?有什么我在这里想念的吗。请问您对此有何经验和想法?
先感谢您!

最佳答案

这种模式确实在很多教程和在线资源中使用了很多,但我认为它已经过时了。在 XML 时代,您没有配置类这样的东西,因此配置 bean 的主要方式是 XML 条目,为协作者提供公共(public) setter 。由于您不想在您的 API 中公开它,因此拥有一个声明您的公共(public) API 的接口(interface)和处理它的实现是有意义的。
在现代 Spring 中,这种世界观已经完全过时了,我们这边当然没有对这种范式的强烈渴望。构造函数注入(inject)现在是常态,因此,接口(interface)与其唯一实现之间的分离不是很有用。
有人可能会争辩说,他们不希望任何 Spring 注释出现在公共(public) API 上,因此这仍然是一种用途。也就是说,如果您使用构造注入(inject)和显式 bean 注册,则不需要任何依赖注入(inject)的注释。如果您对此有强烈的感觉并使用其他方面(例如事务或缓存),那么是的,如果您想从公共(public) API 中隐藏这些注释,则必须创建一个接口(interface)。

关于java - SpringBoot 应用程序中的每个 @Service 类是否应该实现一个接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69185721/

相关文章:

java - super 中的Unnest方法

java - Tapestry属性文件+注入(inject),实现对参数[n]的支持

java - 使用 Hibernate 时出现 StringIndexOutOfBoundsException

java - Spring - 使用 java 配置为 xml 配置 Jboss Intros?

java - 无法从异步方法获取应用程序属性

Java类混淆

java - Spring Batch - 将参数传递到作业参数生成器中

java - 简单更新已锁定

java - zalando Problem-spring-web 生成不需要的堆栈跟踪

java - 配置 Springboot 以使用 2 个不同的数据库