【发布时间】:2019-05-25 06:52:24
【问题描述】:
Sample project structure that can be found in most of the appliations
在大多数 Spring Boot 应用程序中,都有 JPA 存储库、服务和服务实现。谁能解释一下
- 仅在需要时才使用存储库
- 使用服务类及其应用程序。
- 使用服务接口并使用实现。
不同的博文有不同的解释。寻求专家经验。
【问题讨论】:
标签: java spring-boot jpa
Sample project structure that can be found in most of the appliations
在大多数 Spring Boot 应用程序中,都有 JPA 存储库、服务和服务实现。谁能解释一下
不同的博文有不同的解释。寻求专家经验。
【问题讨论】:
标签: java spring-boot jpa
首先,每个设计模式都是为了解决软件开发中的一个常见问题。如果您确定在特定用例中不会遇到这些问题,则无需遵循这些模式。
您可以直接从控制器或任何您需要的地方调用存储库。存储库应该执行基本的数据库操作,如果您需要的话,调用它们没有问题。
但大多数时候,您希望在使用数据库之前/之后执行一些业务逻辑。这就是涉及服务类的地方(SOLID 原则之一是单一职责原则 - 您不应该在同一个类中同时拥有持久性操作和业务逻辑)。例如,您调用 EmployeeService.save() 方法来保存员工,该方法执行业务逻辑(例如,检查员工的 ID 号是否正确),然后调用存储库类(仅将员工保存在数据库)。
接口和实现模式是最后一个模式的扩展。如果需要新功能,拥有接口可以让您的应用程序在未来更易于维护。理想情况下,您的大多数应用程序都会调用接口,并提供适当的实现(例如,通过注入 Spring 组件)。例如,如果一年后您需要一个执行不同业务逻辑的特殊实现,您可以只实现该接口并根据需要注入 bean。
这就是为什么大多数开发人员使用存储库-接口-实现结构来保证他们的应用程序面向未来的原因。如果您确定只需要基本的 CRUD 操作,则无需创建服务。
【讨论】:
1.仅在需要时才使用存储库-->您应该仅在需要时创建和使用它;没关系。一般来说,除非您确实需要,否则不要创建某些东西,这是一种很好的做法。
2.使用服务类并使用它 --> 服务只是你通过从存储库类(DAO-数据访问对象层)获取一些数据来编写业务逻辑的类;将它们隔离是一种很好的做法;这样 DAO 或服务的任何更改都不会相互影响。
3.用户服务接口并实现该接口并使用该实现。
一般而言,您根据界面进行编码;其良好的设计和编码实践;这样你就可以创建松散耦合的代码;因此,无论您在何处使用服务,您都可以将其作为接口类型注入,并且您可以插入和拔出其带下划线的实现;当然,如果您的服务接口有多个实现。 例如,您的 ShapeService 接口有两种不同的实现,供两个不同的客户端计算面积,其中一个客户端有兴趣计算 Recatangle 的面积,而另一个在 Square 中。因此,在这种情况下,如果您创建 Service 接口及其 Impl;对于将要使用此 Service 接口的类,您可以保持逻辑完整或不变。同样,将来如果有很多形状的实现,它会很容易改变;您的代码设计将对扩展开放,但对修改关闭。
如果你有一个服务类的实现,我建议你直接使用类,而不是创建服务接口,然后分离 Impl 类;
【讨论】: