Spring 里 Service 层分成接口+Impl 的好处是什么?

2021-01-02 18:17:37 +08:00
 AAASUKA

分开写感觉很累赘,为什么很多人这么选择?
为什么不直接用一个 Service 类实现

8379 次点击
所在节点    Java
70 条回复
hantsy
2021-01-02 23:56:46 +08:00
@chendy 多个实现的场景太多。

只是国内的架构师,做软件设计的角色,没有起到相应的作用,其根源也是国内的公司都是猴急一样的做项目,没有回到软件系统设计本身,各种文档,各种形式很足,做出来的东西一团糟。

对于复杂的业务流程,都是可以完全接口调用方式设计,完全先不管具体实现,用一个 Dummy 实现先去验证设计上的逻辑是否能够合理。

我在国内公司呆那么多年,从来没有哪个公司会让你花时间写 POC 去验证一套流程的合理性。如果做国外的产品项目就完全不一样,你有很多机会去想如何才能做到真正的逻辑上的解耦。
hantsy
2021-01-03 00:00:11 +08:00
@extreme
@ElmerZhang
@yetone 早期写测试,Mocking 的时候,的确需要接口。但现在最流行的 Mockito 一样是可以 Mock 类的,Spring 进行了集成,可以直接 @MockBean,@SpyBean 。
hantsy
2021-01-03 00:02:02 +08:00
hantsy
2021-01-03 00:03:19 +08:00
Lxxyx
2021-01-03 00:03:25 +08:00
理论上这种面向接口编程可以做到先思考,再实现等诸多优点。

实际上很多业务的接口都是一对一的,不会复用,也不会留足时间给你慢慢先思考再上线。。更多的是 CRUD 莽代码。

但自己还是要知道这种编程范式和带来的优势的(楼上都说过了),用不用那是另外一回事。
hantsy
2021-01-03 00:04:20 +08:00
不过这里本身使用了 SpringData,Repsoitory 就是接口,用具体的类也是一样的测试。
hantsy
2021-01-03 00:14:14 +08:00
真正的软件产品开发,你应该花一半时间去思考如何实现(接口抽象的阶段),另外一半时间去写实现和测试。
young1lin
2021-01-03 00:15:22 +08:00
1. 面向接口编程,而非实现(其实这个是屁话,更多的是代码遗留问题,因为以前的项目都是贫血模式开发的,这个也适合中小项目)。

2. 如果你实际编程中由于某些原因想替换掉其中一个方法的话,可以替代 @Lookup 注解,直接换另一个实现类。

3. 还有一个是 RPC 调用,引入接口即可,然后通过 Annotation*BeanPostProcessor 之类的将接口装饰成具体代码调用。例如 @DubboService 这种。你定义入参就行了,不用关心其具体的实现,你在其他 Service 或者 Controller 直接构造方法注入就 ok 了。
ruoxie
2021-01-03 00:46:26 +08:00
跟创建代理有关吧,没写过 java,Spring 里应该是一堆的 IOC,AOP 。之前写过 c#,c# 里创建代理要么基于接口实现,要么是重写虚方法,一般都是基于接口实现。
simonlu9
2021-01-03 10:57:09 +08:00
c 语言也是这样的,先声明下头文件,然后再写实现,后来 spring 的引入,让这个更加有说服力
hantsy
2021-01-03 10:57:38 +08:00
@ruoxie 早期 Proxy 都是需要接口的。
anzu
2021-01-03 11:13:38 +08:00
1. 可以让技术负责人之类的专注于业务框架的搭建,具体实现让组员来做。
2. 微服务,调用者需要知道接口参数,但不需要知道接口实现。
3. 安全性,算是微服务的延伸,比如 UserAuthService 之类的,无关人员只需以 git submodule 引入接口项目即可使用,做到了代码的保密性。
hantsy
2021-01-03 12:09:52 +08:00
@anzu Microservice 一个原则,各服务应该自治,根本就不关心其他服务的代码层面的实现(不管是接口还是 Impl ),每个服务都是可以用不同的语言和框架实现。

服务之间交互通过轻量协议( Http,Message Broker,gRPC,RSocket 等)定义。
tianlan
2021-01-03 12:21:35 +08:00
最近在看设计模式。 书上说 桥接模式 是将一个工程的 抽象与实现分离,从而在开发的时候独立使用。 我想 这个是一个扩展
idoggy
2021-01-03 12:24:39 +08:00
可以建议团队内部放弃这种写法,很好推动的,根本不会有阻力。除非是很老早的 spring 那没办法得带上接口,现在项目里接口也就用在多态上,普通流程都是 controller 调 service 调 dao 完事。
taowen
2021-01-03 13:26:56 +08:00
你感受不到好处,就是没好处,不要怀疑。
312ybj
2021-01-03 13:30:08 +08:00
首先这个是有用的。
面向接口编程的优势很大,策略模式可以借助接口实现具体策略的导入。
你慢慢实践设计模式,你就会发现设计模式里都是这种设计,
Cbdy
2021-01-03 13:49:30 +08:00
@ElmerZhang mockito
charlie21
2021-01-03 14:17:02 +08:00
保障 JAVA 大军的就业人口
zxCoder
2021-01-03 14:37:18 +08:00
不知道 学的时候大家都这样写,去公司实习,发现大佬们也是这样写,就跟着写了 🐕

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/741075

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX