SpringBoot应用程序中的每个@Service类是否都应该实现一个接口

Emm*_*ard 4 java spring spring-boot

Spring/SpringBoot 粉丝/专家大家好,

\n

希望你\xe2\x80\x99一切顺利。我\xe2\x80\x99已经解决这个问题有一段时间了,我想我\xe2\x80\x99d向spring/springboot专家询问他们对此的意见和经验。它\xe2\x80\x99是关于接口的,因为它与它在springboot中的使用有关。

\n

首先我要说的是;从 Java 或软件工程的角度来看,我理解并清楚接口的使用或目的,它们是契约。

\n

因此,从 springboot 作为 FRAMEWORK/library 的角度来看,它在框架源代码中是有意义的。

\n

现在,从 springboot 作为应用程序我看到了每个服务类(@Service)都有一个相应接口的情况:

\n
public interface MyService {} \npublic class MyServiceImpl implement MyService {}\n
Run Code Online (Sandbox Code Playgroud)\n

99.99% 的情况下,这些接口永远不会被其他任何东西实现。为什么这在 springboot 中变得如此流行,每个服务类都有一个相应的接口,尽管没有其他东西可以实现这些接口?

\n

对我来说,这似乎会带来更多的复杂性和需要维护的代码,但没有明显的好处。请注意,I\xe2\x80\x99m 仅严格指@Service类接口。

\n

这样做是好的做法吗?这里有没有我\xe2\x80\x99m 缺少的东西。请问您对此的经验和想法是什么?

\n

先感谢您!

\n

Ste*_*oll 8

这种模式确实在很多教程和在线资源中被大量使用,但我认为它已经过时了。回到 XML 时代,还没有配置类之类的东西,因此配置 bean 的主要方法是 XML 条目,并为协作者提供公共 setter。由于您不想在 API 中公开这一点,因此拥有一个声明您的公共 API 的接口以及处理它的实现是有意义的。

对于现代的 Spring,这种世界观已经完全过时了,我们这边当然也没有强烈的愿望建立这样的范式。构造函数注入现在已经成为常态,因此,接口与其唯一实现之间的分离并不是很有用。

有人可能会争辩说,他们不希望任何 Spring 注释出现在公共 API 上,因此这仍然是一种用途。也就是说,如果您使用构造注入和显式 bean 注册,则不需要任何依赖注入的注释。如果您对此有强烈的感受并使用事务或缓存等其他方面,那么如果您想从公共 API 中隐藏这些注释,则必须创建一个接口。

  • @ritesh,我真的不明白你在哪里看到没有用于合约的单个实现的接口是一种不好的做法。问题是 Spring 是否以任何方式强制执行这一点,答案是否定的。 (2认同)
  • 我指的是使用接口 + 实现来隐藏 setter 注入。也就是说,我不会更新我的答案,因为我不同意你的观点,即需要接口必然意味着健全的 OO 设计。 (2认同)