Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在SpringMVC控制器中使用服务和DAO_Java_Spring_Design Patterns_Spring Mvc - Fatal编程技术网

Java 在SpringMVC控制器中使用服务和DAO

Java 在SpringMVC控制器中使用服务和DAO,java,spring,design-patterns,spring-mvc,Java,Spring,Design Patterns,Spring Mvc,我正在构建一个web应用程序,它主要由来自后端/数据库的数据的CRUD操作组成。在某些情况下,我必须编写业务逻辑(我相信随着开发的深入,我们将构建更多的业务逻辑)。目前,对于我正在创建的每个UI屏幕,我创建了一个模型类、服务类、DAO类、一个控制器(本质上是servlet)和一堆jsp页面。在大多数情况下,服务类只是从DAO调用方法来传入模型对象。本质上,我们使用模型类从UI屏幕映射数据。因此,在提交表单时,控制器将填充模型对象。我已经开始使用服务类来保持从web层到DAO层的分离层。但有时我觉

我正在构建一个web应用程序,它主要由来自后端/数据库的数据的CRUD操作组成。在某些情况下,我必须编写业务逻辑(我相信随着开发的深入,我们将构建更多的业务逻辑)。目前,对于我正在创建的每个UI屏幕,我创建了一个模型类、服务类、DAO类、一个控制器(本质上是servlet)和一堆jsp页面。在大多数情况下,服务类只是从DAO调用方法来传入模型对象。本质上,我们使用模型类从UI屏幕映射数据。因此,在提交表单时,控制器将填充模型对象。我已经开始使用服务类来保持从web层到DAO层的分离层。但有时我觉得服务类只是添加了不必要的API调用级别,我认为我可以将DAO注入控制器并更快地完成任务。我只想在需要执行其他业务逻辑时使用服务类。如果你必须设计一个应用程序,你会考虑哪些因素使用控制器-DAO与控制器->服务-DAO控制流?

< P> DAOS是更细粒度的,并且处理一个特定的实体。服务提供宏观级别的功能,最终可能使用多个DAO。通常,服务用于定义事务边界以获得原子性。换句话说,如果您最终使用多个DAO更新多个表,那么在服务中定义事务边界将有助于提交或回滚对DB所做的所有更改

在您的设计中,由于您主要为各种实体执行CRUD,因此服务似乎没有增加多少价值。但是,可以将基于web的前端视为更新数据的一种方式。服务的使用将允许您在以后向其他形式的客户机(如第三方集成商等)公开与web服务相同的功能

总之,您的设计似乎符合传统做法。如果您觉得可以基于某个公共主题将多个服务组合成一个服务,这样可以减少代码开销,那么您应该继续这样做。归根结底,最终的目标是创建可维护的代码,当需要时,没有人害怕更改这些代码。

我会参考我的答案


长话短说,使用服务层的优势在于,如果您想使用Spring安全性和角色等做任何事情,它将为您提供在未来移动的空间。它允许您更原子化地处理事务,Spring本身对此有非常好的注释。

在处理多个事务时使用服务类

将存储库(也称为返回集合的dao)或dao直接注入控制器,无需额外的层/类来执行基本get

仅在必要时使用服务类,否则您的代码是所需代码的两倍


您可以将存储库设置为泛型,并使用执行事务的
@Transactional(propagation=propagation.REQUIRED)
进行注释,但如果事务已存在,则不会创建新的事务。因此,如果您以后在一个服务类方法中使用multple repositoes,您将只拥有一个事务。

在Pro-Spring-3书中,他们在下面一行提到,对于带JPA2的控制器

它们使用与服务和存储库相同的类,如下所示:

package com.apress.prospring3.ch10.service.jpa;
// Import statements omitted
@Service("jpaContactService")
@Repository
@Transactional
public class ContactServiceImpl implements ContactService {
private Log log = LogFactory.getLog(ContactServiceImpl.class);
@PersistenceContext
private EntityManager em;
// Other code omitted
}

但如果您要使用spring data CrudePository或JPARepository,那么您的DAO将是接口,您必须创建服务层来处理您的代码

“服务的使用”您不需要;不需要服务类来返回简单的列表/执行crud或作为restful api公开。在操作多个交互实体时,您需要一个服务类。在提供外部应用程序时,您也需要服务。假设您有一个为Android应用程序提供数据的web服务。您可以创建一个服务层,该层将获取数据并返回适配器层的DTO(数据传输对象),适配器层处理REST请求并将这些DTO转换为JSON或XML以发送到Android应用程序。然后,您必须经历从控制器中取消DAO关注点的痛苦。如果您的控制器与DAO紧密链接,那么如果您还没有构建服务层,这将是未来的更多工作。因为服务应该提供关注点分离。如果引入了服务层,那么忽略该服务外观并直接从控制器转到DAO将是一种糟糕的做法。虽然最初您会打破枯燥的规则,不需要服务层,对于未来的任何重构来说,它将是一个更痛苦的事实。我将把它留在这里,因为它基本上总结了我的推理,为什么为一个可能会变得越来越复杂的应用程序提供一个服务层是一个好主意。当我开始我当前的工作时,我进入了一个已经存在的项目。我在这里已经一年多了。老实说,我刚刚意识到应该有一个单独的层用于注入DAO。工作中的项目只是将它们注入控制器。现在我知道了这一点,并且已经准备好了原子性的好处,我认为有一个服务层会很好,因为我们在整个应用程序中有多个交互实体。
package com.apress.prospring3.ch10.service.jpa;
// Import statements omitted
@Service("jpaContactService")
@Repository
@Transactional
public class ContactServiceImpl implements ContactService {
private Log log = LogFactory.getLog(ContactServiceImpl.class);
@PersistenceContext
private EntityManager em;
// Other code omitted
}