Java 服务层和控制器:谁负责什么?

Java 服务层和控制器:谁负责什么?,java,spring,architecture,business-logic,Java,Spring,Architecture,Business Logic,在课堂上,我们现在学习如何构建Spring应用程序,即使Spring没有直接参与,我们也学习了如何为DAO和服务层对象创建接口 如果我错了,请纠正我: DAO层非常抽象:它只包含CRUD操作,并进一步用于读取数据。(即:获取所有对象、获取特定对象等) 服务层:包含用于创建内容和删除内容的服务,这是业务逻辑应该位于的位置 现在,所有这些在服务层都是有意义的;除了“更新”对象。您是否只需要添加一个“更新”函数,将对象保存到数据库中?或者你也需要定义其中的逻辑吗?这就是我的困惑所在,我的理解是,春天的

在课堂上,我们现在学习如何构建Spring应用程序,即使Spring没有直接参与,我们也学习了如何为DAO和服务层对象创建接口

如果我错了,请纠正我: DAO层非常抽象:它只包含CRUD操作,并进一步用于读取数据。(即:获取所有对象、获取特定对象等)

服务层:包含用于创建内容和删除内容的服务,这是业务逻辑应该位于的位置

现在,所有这些在服务层都是有意义的;除了“更新”对象。您是否只需要添加一个“更新”函数,将对象保存到数据库中?或者你也需要定义其中的逻辑吗?这就是我的困惑所在,我的理解是,春天的物体只是波乔的。那么谁来验证数据呢

假设我有一个对象“child” 它有:
姓名
姓氏
性别
照片
生日
领域。 我将如何命名这些服务?或者你会让控制器负责验证,这在我看来是不对的。另一方面,将需要调用的每个setter委托给服务层似乎也不正确


因此,基本上就是:帮助我定义如何通过服务层保存对象。

如果您希望控制器能够持久化对
子对象的更改,那么传统上您将在服务中有一个名为
ChildService.update(Child newchild)
的方法,它将处理调用正确的DAO来持久化此子级的新版本

控制器可以自由地向服务请求一个子项,更改周围的字段(可能基于一些用户输入)——一个合理的设计会让控制器对子项POJO做一些工作,然后请求服务保持更改。模型POJO应该不知道关于控制器、服务或DAO的任何信息,而只是按照您的建议保存数据——当然,您不希望每次调用
setName()
setGender()
都自动导致数据库更新

相反,控制器和/或服务应该获取一个子对象,在其工作单元中对该对象执行任何需要的操作,然后请求服务(然后是DAO)保存更改


验证可以在多个层中进行-控制器可能希望验证来自web用户的任何输入,服务可能希望在持久化它之前验证它是否具有有效的
子对象。如果您想在其他功能中重复使用此服务,例如公开REST接口、不同的前端等,在这两个层中进行某种程度的验证尤其有意义。

通常,Spring服务是事务性的。事物进入特定的服务方法,因为它们应该在同一事务中分组在一起。如果要从数据库中检索对象、旋转它并保存新版本,则检索和保存应该在同一个服务方法中。因此,您的服务方法是根据您需要应用程序为用户做什么来确定的

我试图限制控制器执行与验证http参数相关的工作,决定使用什么参数调用什么服务方法,在httpsession或请求中放置什么,重定向或转发到什么视图,或类似的web相关内容

就验证而言:验证控制器中的输入参数是一件好事,可以确保没有人能够用虚假输入破坏您的应用程序。控制器中的验证往往是关于确保输入在语法上是正常的(包括检测注入攻击),而服务级别验证是关于确保数据库中的事物的状态是您期望的状态


因此,控制器包含web框架基础结构代码,服务包含应用程序逻辑代码。

再加上一点:一般来说,“服务”(不仅仅是在使用Spring时,也可能是在公开远程服务或某种API时)有一些方法是事务的自然候选方法是个好主意