Spring data jpa repo,为啥需要接口服务和服务实现

Posted

技术标签:

【中文标题】Spring data jpa repo,为啥需要接口服务和服务实现【英文标题】:Spring data jpa repo, why need interface service and service implementationSpring data jpa repo,为什么需要接口服务和服务实现 【发布时间】:2018-01-01 22:12:56 【问题描述】:

我刚刚开始使用Spring Data JPA 处理Spring Boot。当我从表中生成模型时,我创建了一个扩展 JpaRepository<myModel, String> 的 modelRepo

public interface userRepository extends JpaRepository<User, String>

然后从控制器,我可以很容易地调用userRepository.findAll() 来获取数据。

但是,当我查看一些教程时,它们在调用 findAll() 之前有额外的几个步骤。往下看:

public interface userService
Iterator findAll();

    public class userServiceImpl implements userService
       @Autowired
       UserRepository userRepository
       @Override
       Iterator findAll()
        return userRepository.findAll();
       
    

诸如此类,我可以直接从userRepository查询数据,只要@Autowired注入userRepository即可。

在某些示例中,它们的结构与上述相同。谁能解释一下为什么在调用数据之前我们需要serviceserviceImpl

【问题讨论】:

可能该服务提供了不止一种 (findAll) 方法。所以也许是一个方法findAllKids() 然后在内部计算每个用户的年龄并只返回孩子。因此,您可以将服务称为具有附加功能的包装类 【参考方案1】:

您不必使用服务即可查询数据。当您在应用程序的另一部分需要相同的功能时,最好编写一个服务来防止代码重复。

【讨论】:

感谢您的帮助。【参考方案2】:

因为所谓的“服务”类(“继承”了 N 层架构)是业务逻辑“存在”的地方。最后,这取决于您的方法/设计指南、您希望管理交易的方式、构建项目等等。

如果您只需要调用数据库并返回该数据,则可以安全地跳过“服务”调用/类。另一方面,如果您在“现实生活”中做某事,您最终会大量使用这些“服务”类,因为大多数操作(阅读:业务逻辑)将在那里,所以您希望将所有这些行为隔离在一个地方——否则您将到处注入 bean,而无需遵循任何“项目组织”等。有时这有点乏味,但另一方面,当您需要更改某些内容时,您知道在哪里寻找。在大中型项目中,这非常重要;如果您有几个人修改相同的代码库,则更多。

提示:让你的班级保持小规模。在“服务”类上注入大量 bean(存储库、服务等等)是糟糕的设计,可能会导致您陷入其他荒谬的境地。

【讨论】:

感谢您的帮助。【参考方案3】:

将应用程序的功能分离到单独的类中是一种很好的做法。 (参见单一职责原则https://en.wikipedia.org/wiki/Single_responsibility_principle)。

我在此上下文中的意思是,如果您需要在控制器和对 JPA 存储库的调用之间执行一些更高级的业务逻辑,那么这应该包含在服务层中。这可以防止您的控制器类在只关心处理请求并将责任传递给服务层时被业务逻辑污染。

但是,如果您只是做一些简单的 CRUD 操作,那么直接从控制器调用存储库就完全没问题了。所以这取决于你的应用真正需要做什么!

【讨论】:

感谢您的帮助。 @TranTam 没问题 :) 随时为您认为有用的任何答案投票。 ;)

以上是关于Spring data jpa repo,为啥需要接口服务和服务实现的主要内容,如果未能解决你的问题,请参考以下文章

为啥手动定义的 Spring Data JPA 删除查询不会触发级联?

为啥在 Spring Data JPA Repository 上的 save() 之后使用返回的实例?

为啥使用 Spring Data JPA 更新实体时@Transactional 隔离级别不起作用?

Spring Data JPA 审计不适用于带有 @Modifying 注释的 JpaRepository 更新方法,为啥?

带有 Hikari 的 Spring Data JPA:为啥 hikari 自动提交属性设置为“true”?

为啥在将 Spring Data JPA 与 Spring Boot 结合使用时,我的数据库自定义没有得到应用?