我正在使用spring和hibernate编写RESTful服务。我在互联网上阅读了很多资源,但他们没有澄清我的疑虑。请详细解释一下spring框架中的 DAO , DTO 和 Service 层是什么?为什么在Spring中需要使用这些层来开发RESTfull API服务。
答案 0 :(得分:47)
首先,这些概念是 Platform Agnostic ,并不是Spring Framework或任何其他框架所独有的。
DTO
是一个在进程之间传输数据的对象。当您使用远程接口时,每次调用都很昂贵。因此,您需要减少呼叫次数。解决方案是创建一个Data Transfer Object
,它可以保存呼叫的所有数据。它需要 serializable 才能跨越连接。通常在服务器端使用汇编程序在DTO
和任何域对象之间传输数据。这通常很少
不仅仅是一堆字段以及它们的吸气剂和制定者。
A Data Access Object
摘要并封装所有访问权限
数据源。 DAO
管理与数据源的连接
获取并存储数据。
DAO实现了使用数据源所需的访问机制。
数据源可以是RDBMS
之类的持久性商店,也可以是通过REST
或SOAP
访问的商家服务。
DAO
将Service
个对象的基础数据访问实现抽象为
启用对数据源的透明访问。 Service
也代表
数据加载和存储操作到DAO
。
Service
个对象正在做的工作
应用程序需要为您正在使用的域执行操作。它涉及基于输入和计算的计算
存储的数据,验证来自演示文稿的任何数据,以及确切地确定哪些数据
要发送的源逻辑,具体取决于从演示文稿中收到的命令。
Service Layer
定义应用程序的边界及其可用操作集
连接客户端层的视角。它封装了应用程序的业务逻辑,控制
交易和协调执行其业务的响应。
Martin Fowler有一本关于名为Patterns of Enterprise Application Architecture的常见应用程序架构模式的好书。还有,Core J2EE Patterns值得一看。
答案 1 :(得分:3)
企业应用程序分为几层,便于维护和开发。等级专用于特定类型的任务,如
为什么这个设计: 让我们选择一个示例,您有一个从db读取数据并在其上执行一些业务逻辑然后将其呈现给用户的应用程序。现在,如果你想更改你的数据库,请说早先的应用程序在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接口的任何实现。 服务和DTO也用于分离关注点。
答案 2 :(得分:3)
提供通用接口以执行所有数据库操作(如持久性机制)的对象。
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
在进程之间传递数据以减少方法调用数的对象意味着您在服务层中组合了多个POJO实体。
例如,GET请求/rest/customer/101/orders
将检索客户ID 101
的所有订单以及客户详细信息,因此您需要将实体Customer
和实体Orders
合并为详细信息
答案 3 :(得分:1)
DTO:我们在不同进程之间或同一进程内传递的数据对象。它可以是实际实体对象的包装器。将实体对象原样用于 DTO 是不安全的,不推荐使用。该对象的设计基于多种因素,例如表示的简单性、公开 Id 的安全性、消费者需求等。
在 Spring 中,DTO 可以由一个简单的模型/pojo 对象构成。
DAO:负责 CRUD 操作的对象。
在 Spring 中,这可以是实现 JPARepository 接口的对象,也可以是任何连接数据库并为我们执行 CRUD 的 bean。请记住您从 JDBC 到 Hibernate 再到 Spring 数据 JPA 的旅程。 :)
Service:用于业务逻辑实现的核心 bean。此对象可能具有 DAO 对象作为其依赖项。特定用例的核心业务逻辑将放在此处。
在 Spring 中,可以通过使用 @Service 或 @Component 批注对 bean 进行批注或使用 java 配置将对象简单地表示为 bean 来创建服务对象/bean。确保将所有必需的依赖项注入到服务 bean 中,以完成繁重的工作。
答案 4 :(得分:-1)
服务层:
它从控制器层接收请求并将请求处理到持久层
DTO:
这是一个数据传输对象,用于将属性从服务层传递到持久层。
DAO:
它是一个数据访问对象。它也被称为持久层。在此DAO中,我们从DTO对象中的服务层接收属性值。在这里,我们将持久性逻辑写入db。
答案 5 :(得分:-3)
DTO是Spring中的@Entity
注释
DAO是Spring中的@Repository
注释(使用Spring Boot JPA,您只需要实现界面,现在不需要注释)
服务是春天的@Service
注释
您可以在此处阅读更多内容:Accessing Data with JPA