Spring Boot 应用中服务层有啥用?
Posted
技术标签:
【中文标题】Spring Boot 应用中服务层有啥用?【英文标题】:What is the use of service layer in Spring Boot applications?Spring Boot 应用中服务层有什么用? 【发布时间】:2020-02-02 15:52:42 【问题描述】:我是 Spring Boot 新手,我正在创建一个没有 UI 的 RESTful API。
我正在考虑是否应该使用业务服务并从那里调用存储库,还是直接从我的 REST 控制器调用存储库?
【问题讨论】:
请看这个***.com/questions/46442790/…你可以从这里得到答案 感谢@PratikSherke 该链接很有用。我在发布自己的问题之前尝试寻找它,但找不到它。谢谢 【参考方案1】:Service 层并不是 Spring Boot 独有的概念。这是一个软件架构术语,经常被称为模式。简单的应用程序可能会跳过服务层。实际上,没有什么能阻止您从控制器层调用存储库方法。
但是,我强烈建议使用服务层,因为它主要用于定义应用程序边界。服务层职责包括(但不限于):
封装业务逻辑实现; 集中数据访问; 定义事务开始/结束的位置。引用 Martin Fowler 的 Catalog of Patterns of Enterprise Application Architecture 中的 Service Layer pattern:
服务层从连接客户端层的角度定义了应用程序的边界及其可用操作集。它封装了应用程序的业务逻辑,控制事务并在其操作的实现中协调响应。
【讨论】:
【参考方案2】:关注点分离是关键:
控制器(表示层或端口)是一个协议接口,它将应用程序功能公开为 RESTful Web 服务。应该如此,仅此而已。 存储库(持久层或适配器)抽象持久化操作:查找(按 id 或其他标准)、保存(创建、更新)和删除记录。应该如此,仅此而已。 服务层(域)包含您的业务逻辑。它定义了您提供的功能、访问方式以及传递和返回的内容 - 独立于任何端口(其中可能有多个:Web 服务、消息队列、预定事件)并且独立于其内部工作原理(服务使用存储库,甚至数据在存储库中的表示方式与任何人无关)。服务层可以从存储库数据中进行 1:1 转换,或者可以应用过滤、转换或聚合附加数据。业务逻辑一开始可能很简单,提供的只是简单的 CRUD 操作,但这并不意味着它会永远保持这种状态。一旦您需要处理访问权限,就不再需要将请求从控制器直接路由到存储库,而是还要检查访问和过滤数据。请求在访问数据库之前可能需要验证和一致性检查,可能会应用规则和其他操作,因此您的服务会随着时间的推移获得更多价值。
即使是简单的 CRUD 案例,我也会引入一个服务层,它至少可以将 DTO 转换为实体,反之亦然。
让您的控制器/存储库(或端口和适配器)保持愚蠢,让您的服务保持智能,这样您就可以获得可维护且可良好测试的解决方案。
【讨论】:
以上是关于Spring Boot 应用中服务层有啥用?的主要内容,如果未能解决你的问题,请参考以下文章