在spring mvc控制器中使用Services和DAO

时间:2013-04-26 09:57:09

标签: java spring design-patterns spring-mvc

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

4 个答案:

答案 0 :(得分:11)

DAO更精细,可以处理一个特定的实体。服务提供宏级功能,最终可能使用多个DAO。通常,服务用于定义事务边界以获得原子性。换句话说,如果您最终使用多个DAO更新多个表,则在服务时定义事务边界将有助于提交或回滚对DB执行的所有更改。

在您的设计中,由于您主要为各种实体进行CRUD,因此服务似乎没有增加太多价值。但是,将基于Web的前端视为更新数据的一种方式。使用服务将允许您稍后将其与Web服务相同的功能暴露给其他形式的客户端,如第三方集成商等。

因此,总而言之,您的设计似乎与传统做法一致。如果您认为可以基于某些常见主题将多个服务组合成一个,以便可以减少代码的开销,那么您应该继续执行它。在一天结束时,最终目标是创建可维护的代码,在需要时不会有人害怕改变。

答案 1 :(得分:1)

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

Once the EntityManagerFactory had been properly configured, injecting it into your service layer
classes is very simple.

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

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 CRUDRepository或JPARepository,那么您的DAO将是Interface,您必须创建服务层来处理您的代码

答案 2 :(得分:0)

我会参考我的回答here

使用服务层的优点是,如果您想对Spring Security和角色等做任何事情,它可以让您在未来移动。它允许您更原子地处理事务和Spring本身对此有非常好的注释。

答案 3 :(得分:0)

在处理多个aggregate root时使用服务类。

将存储库(也就是返回集合的dao)或dao直接注入控制器,不需要额外的图层/类来进行基本获取。

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

您可以使存储库具有通用性,并使用强制执行事务的@Transactional(propagation = Propagation.REQUIRED)进行保留,但如果已存在则不会创建新的存储。因此,如果您稍后在一个服务类方法中使用多个repositoes,那么您将只有一个事务。