Spring Boot应用程序中服务层的作用是什么?

18

我是Spring Boot的新手,正在创建一个没有UI的RESTful API。

我在考虑是否应该使用业务服务并从那里调用存储库,还是直接从我的REST控制器中调用存储库?


2
请查看此链接,https://dev59.com/xFYO5IYBdhLWcg3wDNXI ,您可以从中得到答案。 - Pratik Sherke
谢谢@PratikSherke,那个链接很有用。在发布我的问题之前,我尝试过寻找它,但找不到。谢谢。 - bee
2个回答

27

关注点分离是关键:

  • 控制器(表示层或端口)是公开应用程序功能作为RESTful Web服务的协议接口。它应该只做这个。
  • 存储库(持久化层或适配器)抽象出持久性操作:查找(按ID或其他条件),保存(创建,更新)和删除记录。它应该只做这个。
  • 服务层(领域)包含您的业务逻辑。它定义了您提供的功能,如何访问它们以及要传递和返回什么 - 独立于任何端口(可能有多个:Web服务,消息队列,定期事件)和独立于其内部工作方式(没有人需要知道服务使用存储库,甚至不需要知道数据在存储库中的表示方式)。服务层可以从存储库数据进行1:1转换,也可以对其他数据进行过滤、转换或聚合。

业务逻辑在开始时可能很简单,只提供简单的CRUD操作,但这并不意味着它将永远保持这种状态。一旦您需要处理访问权限,就不再是直接将请求从控制器路由到存储库,而是需要检查访问权限和过滤数据。请求可能需要在访问数据库之前进行验证和一致性检查,还可以应用规则和其他操作,因此您的服务随着时间的推移变得更有价值

即使对于简单的CRUD案例,我也会引入一个服务层,至少将DTO转换为实体,反之亦然。

让您的控制器/存储库(或端口和适配器)保持愚蠢,让您的服务聪明,您将获得可维护且易于测试的解决方案。


17

服务层并非Spring Boot独有的概念,它是一个软件架构术语,常被称为模式。简单的应用程序可以省略服务层。在实践中,您可以从控制器层调用存储库方法。

但是,我强烈建议使用服务层,因为它主要用于定义应用程序边界。服务层的职责包括(但不限于):

  • 封装业务逻辑实现;
  • 集中数据访问;
  • 定义事务的开始/结束。

引用Martin Fowler的服务层模式,摘自《企业应用架构模式目录》

服务层定义了一个应用程序的边界及其可用操作集,从接口客户端层的角度来看。它封装了应用程序的业务逻辑,在实现其操作时控制事务并协调响应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接