Spring框架中的DAO、DTO和Service层是什么?

82

我正在使用Spring和Hibernate编写RESTful服务。我在互联网上阅读了许多资源,但它们没有解决我的疑问。请详细解释在Spring框架中什么是DAO、DTO和Service层?为什么在Spring中需要使用这些层来开发RESTful API服务。

我正在使用 Spring 和 Hibernate 编写 RESTful 服务。我在互联网上阅读了许多资源,但它们没有解决我的疑问。请详细解释在 Spring 框架中 DAO、DTO 和 Service 层是什么,以及为什么在 Spring 中需要使用这些层来开发 RESTful API 服务。
5个回答

109
首先,这些概念是“平台无关的”,并不局限于Spring Framework或任何其他框架。
数据传输对象
DTO是一个在进程之间传递数据的对象。当你使用远程接口时,每次调用都是昂贵的。因此,你需要减少调用的次数。解决方案是创建一个可以保存调用所需所有数据的数据传输对象。它需要是可序列化的以便通过连接传输。通常,在服务器端使用一个组装器来在DTO和任何领域对象之间传输数据。它通常只是一堆字段以及用于获取和设置这些字段的getter和setter方法。
数据访问对象
数据访问对象(Data Access Object)抽象和封装了对数据源的所有访问。DAO管理与数据源的连接,以获取和存储数据。
DAO实现了与数据源一起工作所需的访问机制。数据源可以是持久存储,如关系数据库管理系统(RDBMS),也可以是通过REST或SOAP访问的业务服务。
DAO为Service对象提供了底层数据访问实现的抽象,以实现对数据源的透明访问。Service还将数据加载和存储操作委托给DAO。

服务

服务对象是为您正在处理的领域执行应用程序所需工作的对象。它涉及基于输入和存储数据的计算,验证来自演示的任何数据,并根据来自演示的命令确定要分派的数据源逻辑。

服务层定义了应用程序的边界以及从客户端层面接口的可用操作集。它封装了应用程序的业务逻辑,在其操作的实现中控制事务并协调响应。


推荐参考资料

Martin Fowler有一本关于常见的应用架构模式的好书,名为《企业应用架构模式》。还有一本值得一看的书是《核心J2EE模式》


1
当我已经有ORM时,为什么还需要DAO呢?参考的书几乎是在ORM出现之前的时代。当我使用Web服务时,我会以不同的方式构建它们,而当我想要切换数据库时,ORM就派上用场了。 - Sam
ORM不支持数据库的所有特定功能。 - robert trudel

23

DAO - 数据访问对象:

一个提供通用接口以执行所有数据库操作的对象,如持久化机制。

public interface GenericDao<T> {
  public T find(Class<T> entityClass, Object id);
  public void save(T entity);
  public T update(T entity);
  public void delete(T entity);
  public List<T> findAll(Class<T> entityClass);
}

请看这个例子:Spring - DAO和Service层

DTO - 数据传输对象

一种在进程间传递数据以减少方法调用次数的对象,意味着您需要在服务层中组合多个POJO实体。例如,一个GET请求/rest/customer/101/orders是为了检索客户ID为101的所有订单以及客户详细信息,因此您需要将实体Customer和实体Orders组合起来。


这是另一个示例:http://howtodoinjava.com/spring/spring-orm/spring-3-and-hibernate-integration-tutorial-with-example/ - vels4j

11

企业应用程序分层设计以便于维护和开发。这些层专注于特定类型的任务,如

  • 表示层 (UI)
  • 业务逻辑层
  • 数据访问层(DAO, DTO)

为什么需要这种设计: 假设你有一个应用程序,它从数据库中读取数据并对其执行一些业务逻辑,然后将其呈现给用户。现在,如果您想更改您的数据库,例如先前的应用程序在Oracle上运行,现在您想使用mysql,如果您不按照分层设计来开发,则需要在整个应用程序中进行更改。但是,如果您在应用程序中实现DAO,则可以轻松完成此操作。

DAO:数据访问对象是一种设计模式, 只需提供用于访问服务层数据的接口,并为不同的数据源(数据库、文件系统)提供不同的实现即可。

示例代码:

public interface DaoService {
    public boolean create(Object record);
    public CustomerTemp findTmp(String id);
    public Customer find(String id);
    public List getAllTmp();
    public List getAll();
    public boolean update(Object record);
    public boolean delete(Object record);   
    public User getUser(String email);
    public boolean addUser(User user);
}

使用Dao的服务层

@Service("checkerService")
public class CheckerServiceImpl implements CheckerService{

@Autowired
@Qualifier("customerService")
private DaoService daoService;

现在我可以提供DaoService接口的任何实现。 Service和DTO也被用于关注点分离。


你只有在使用孤立的数据访问层服务并且需要一个特定的接口API来连接时,才需要在DAO层使用DTO。 - alexcorghencea

4

DTO:数据对象,用于在不同进程或同一进程内传递数据。它可以作为实体对象的包装器。直接使用实体对象作为DTO是不安全且不推荐的。该对象的设计基于各种因素,如表示简单性,暴露ID的安全性,消费者需求等。

在Spring中,可以使用简单的模型/POJO对象来形成DTO。

DAO:负责CRUD操作的对象。

在Spring中,这可以是实现JPARepository接口的对象,或任何连接数据库并为我们执行CRUD操作的bean。请记住从JDBC到Hibernate再到Spring Data JPA的学习历程。:)

Service:业务逻辑实现的核心bean。该对象可能以DAO对象作为其依赖项。特定用例的核心业务逻辑将在此处处理。

在Spring中,Service对象/bean可以通过在bean上注释@ Service或@Component注释,或使用Java配置简单地表示对象作为bean来创建。确保将所有所需的依赖项注入服务bean以进行其重要工作。


-3

服务层:

它接收来自控制器层的请求并将请求处理到持久化层。

  • @Controller:这是一个注释,用于初始化整个控制器层。
  • @Service:这是一个注释,用于初始化整个服务层。
  • @Repository:这是一个注释,用于初始化整个持久化层。

DTO:

它是一个数据传输对象,用于将属性从服务层传递到持久化层。

DAO:

它是一个数据访问对象。它也被称为持久化层。在这个DAO中,我们使用DTO对象从服务层接收属性值。在这里,我们编写一个将数据持久化到数据库的逻辑。


1
DTO:它确实是一个数据传输对象,但用于在两个隔离的服务之间通信,而不是在控制器和服务层之间通信。通常用于从UI客户端应用程序使用的REST API控制器。 - alexcorghencea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接