【问题标题】:Spring Architecture Questions: is Service needed?Spring 架构问题:需要服务吗?
【发布时间】:2018-01-26 11:15:15
【问题描述】:

我是 Spring 新手,我正在创建一个 REST 服务。 我想知道服务层是做什么用的(@Service)。 目前我用那个层封装了我的 DAO。 例如,我的 PersonController 收到一个 PUT,调用 PersonService,后者调用 DAO,最终将这个人保存在我的数据库中。

我还看到了一些例子在 www. (https://howtodoinjava.com/spring/spring-core/how-to-use-spring-component-repository-service-and-controller-annotations/)

我也在这里读过这个问题:Is this a good Spring Architecture (include testing)

如果它只调用 DAO,我什至需要服务吗:

public void save(Person p) {
    personDAO.save(p);
}

?

我真的不明白这样做有什么好处。我创建的类实际上什么都不做......或者它只是一个架构标准,因为额外的业务逻辑也将在这一层中?


另外...当我有几个服务,如 personService、familyService、animalService 等,并且它们都有一些相同的方法签名和一些不同的方法签名时......在这里使用接口有用吗?

当我创建以下接口时:可保存、可加载、可删除(这是否有意义?) - 我如何正确使用它们?我是否为每个扩展我想要的接口的服务创建一个新接口?像扩展 Loadable 和 Deleteable 的 PersonServiceInterface 并在我的 PersonService 中实现它?

提前致谢!

【问题讨论】:

  • 使用极其简单的代码,您可以处理很多事情。然而,一旦你真正写出更真实的东西,你就会看到不同架构选择的优势。这可能更适合softwareengineering.stackexchange.com
  • 谢谢。但实际上我正在创建一个 REST 服务,除了从数据库中读取/更新/删除之外,它实际上并没有做任何其他事情。我认为有实际的用例。 (例如社会管理)
  • 好吧,没有人会强迫您编写您认为不必要的代码。一个简单的 CRUD 层不需要太多,可能有自动化工具可以创建一个,因此您甚至不需要编写样板文件。

标签: java spring spring-mvc


【解决方案1】:

如果您觉得不需要服务层,那么很可能您的控制器执行的业务逻辑超出了应有的程度。

在两者之间添加一个服务层允许对纯前端进行专门的测试(控制器仅处理请求和响应接线/服务处理业务逻辑/存储库持久化并查询数据)。

所以经验法则 - 让许多服务处理部分逻辑比将所有内容都塞入控制器要容易得多

我不确定你想用你引入的接口解决什么问题——我认为在你的服务之上重新发明 Repository 接口是没有意义的。如果您的服务仅直接转发到存储库,那么无论如何拥有它们是没有用的。

【讨论】:

  • 感谢您的回答。一个服务可以调用其他服务吗?或者我是否让我的控制器知道另一个知道我需要的服务的控制器并从那里调用该方法?例如,在调用实际服务之前,我需要获取一些信息。例如"return billService.load(new BillId(memberController.loadMember(memberId), year));"
  • 可以链接任意数量的服务。你只需要避免循环依赖。
  • 我在服务层的垂直分离不会一起增长吗?当我拥有越来越多的代码时,是否会难以将其拆分到多个服务器上?
  • 他们不应该需要相互认识来调用业务代码 - 仍然可能存在由于其他原因他们可能需要相互认识的情况(链接生成)
  • @DerKnecht 我建议使用外观而不是让服务调用其他服务。
猜你喜欢
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 2019-08-13
  • 2020-12-16
相关资源
最近更新 更多