Spring Framework 中的 DAO、DTO 和 Service 层是啥?

Posted

技术标签:

【中文标题】Spring Framework 中的 DAO、DTO 和 Service 层是啥?【英文标题】:What are the DAO, DTO and Service layers in Spring Framework?Spring Framework 中的 DAO、DTO 和 Service 层是什么? 【发布时间】:2016-05-06 19:49:21 【问题描述】:

我正在使用 spring 和 hibernate 编写 RESTful 服务。我在互联网上阅读了许多资源,但它们并没有澄清我的疑问。请详细解释一下spring框架中的DAODTOService层是什么?以及为什么在 Spring 中需要使用这些层来开发 RESTfull API 服务。

【问题讨论】:

【参考方案1】:

企业应用程序被划分为易于维护和开发的层。层专门用于特定类型的任务,例如

表示层 (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 也用于关注点分离。

【讨论】:

你想在 DAO 层使用 DTO 的唯一情况是在一个独立的 DAL 服务中,你需要一个特定的接口 API 来连接。【参考方案2】:

首先,这些概念是平台无关的,并不是 Spring Framework 或任何其他框架所独有的。


数据传输对象

DTO 是一个在进程之间携带数据的对象。当您使用远程接口时,每次调用都很昂贵。因此,您需要减少调用次数。解决方案是创建一个Data Transfer Object,它可以保存通话的所有数据。它需要可序列化 才能通过连接。通常在服务器端使用汇编器在DTO 和任何域对象之间传输数据。通常很少 不仅仅是一堆字段以及它们的 getter 和 setter。


数据访问对象

Data Access Object 抽象并封装了所有访问 数据源。 DAO 管理与数据源的连接以 获取和存储数据。

DAO 实现了处理数据源所需的访问机制。 数据源可以是像RDBMS 这样的持久存储,也可以是通过RESTSOAP 访问的业务服务。

DAOService 对象的底层数据访问实现抽象为 启用对数据源的透明访问。 Service 也代表 数据加载和存储操作到DAO


服务

Service 对象正在做 应用程序需要为您正在使用的域做。它涉及基于输入的计算和 存储的数据,验证来自演示文稿的任何数据,并准确找出哪些数据 要调度的源逻辑,取决于从演示文稿接收到的命令。

Service Layer 定义应用程序的边界及其可用操作集 连接客户层的视角。它封装了应用程序的业务逻辑,控制 在执行其操作时进行事务处理和协调响应。


推荐参考

Martin Fowler 有一本关于常见应用程序架构模式的好书,名为 Patterns of Enterprise Application Architecture。还有,Core J2EE Patterns,值得一看。

【讨论】:

当我有 ORM 时,为什么还需要 DAO?参考书几乎是ORM时代之前的东西。当我使用 Web 服务时,无论如何我都会以不同的方式构建它们,而当我想切换数据库时,这就是 ORM 的用途。 orm 不支持数据库的所有特定功能【参考方案3】:

DAO - Data Access Object:

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

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 and Service layer

DTO - Data Transfer Object:

为了减少方法调用次数而在进程之间携带数据的对象意味着您在服务层中组合了多个 POJO 实体。

例如,GET 请求 /rest/customer/101/orders 是检索客户 ID 101 的所有订单以及客户详细信息,因此您需要将实体 Customer 和实体 Orders 与详细信息结合起来。

【讨论】:

这里还有一个例子howtodoinjava.com/spring/spring-orm/…【参考方案4】:

DTO 是 Spring 中的 @Entity 注解 DAO 是 Spring 中的 @Repository 注解(使用 Spring Boot JPA,您只需要实现接口,现在不需要注解) Service是Spring中的@Service注解

您可以在此处阅读更多内容:Accessing Data with JPA

【讨论】:

DTO 概念没有关联任何注解是 Spring 所有这些都是给定代码构造的名称。与 DTO 等效的是 @Entity 注释。 @ahmedjaad question 询问他们在春季的使用情况 我会更新我的答案。最受欢迎的答案是好的,它没有给出任何实际的答案【参考方案5】:

服务层:

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

@Controller:是初始化整个控制器层的注解。 @Service:初始化整个服务层的注解。 @Repository:初始化整个持久层的注解。

DTO:

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

DAO:

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

【讨论】:

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

DTO:我们在不同进程之间或同一进程内传递的数据对象。它可以是实际实体对象的包装器。将实体对象按原样用于 DTO 是不安全的,不推荐使用。该对象的设计基于各种因素,例如表示的简单性、暴露 ID 的安全性、消费者的要求等。

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

DAO:负责 CRUD 操作的对象。

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

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

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

【讨论】:

以上是关于Spring Framework 中的 DAO、DTO 和 Service 层是啥?的主要内容,如果未能解决你的问题,请参考以下文章

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

服务层和 DAO 层中的 Spring 事务

Spring中@Component的作用

Spring Web 开发中的通用 DAO

Yii Framework使用DAO方式查询分页代码

用spring 注解注入;dao和service都为null,是啥原因?