一,MVC和三层架构
二,Spring项目基本架构层次
架构层次 | 常见包名 | 说明 |
---|---|---|
表现层 | controller | 存放控制器类,处理用户请求和返回响应。在 Spring MVC 中,控制器类使用 @Controller 或 @RestController 注解。 |
服务层 | service | 存放服务类,实现具体的业务逻辑。服务类通常使用 @Service 注解。 |
数据访问层 | repository | 存放数据访问对象(DAO)或仓库(Repository)接口和实现类,负责与数据库交互。使用 Spring Data JPA 时,仓库接口通常继承自 JpaRepository 等接口;使用 MyBatis 时,DAO 接口定义 SQL 操作方法。 |
实体层 | entity | 存放实体类,对应数据库中的表结构。实体类使用 JPA 注解(如 @Entity 、@Id )进行映射。 |
配置层 | config | 存放 Spring 配置类,使用 @Configuration 注解,用于配置数据源、事务管理器、组件扫描等。 |
工具层 | utils | 存放通用的工具类,提供日期处理、字符串处理、加密解密等通用功能。 |
异常处理层 | exception | 存放自定义异常类和异常处理器,用于统一处理项目中抛出的异常。 |
常量层 | constants | 存放项目中使用的常量,如状态码、错误信息、配置参数等。 |
三,分层对象模型
类型 | 所在层级 | 作用 |
---|---|---|
VO(View Object) | 表现层(前端或后端表现层与前端交互部分) | 1. 为视图展示而设计,封装了用于前端页面展示的数据,数据格式通常贴合前端页面的展示需求。 2. 可包含一些视图层面的格式化信息,如日期格式、金额格式等,方便前端直接展示。 |
DTO(Data Transfer Object) | 表现层与服务层之间 | 1. 用于不同层之间的数据传输,尤其是在表现层和服务层之间传递数据。 2. 去除了仅用于视图展示的信息,只保留与业务逻辑相关的数据,可对数据进行进一步整理和规范,以适应服务层的业务处理需求。 3. 可以组合多个实体的数据,将不同来源的数据整合到一个 DTO 中进行传输。 |
DO(Domain Object) | 服务层 | 1. 代表业务领域中的对象,封装了业务逻辑和业务规则,是业务操作的核心载体。 2. 包含业务领域的属性和行为,用于在服务层进行业务逻辑的处理和计算。 3. 与业务领域的概念紧密相关,反映业务的真实状态和规则。 |
PO(Persistent Object) | 数据访问层 | 1. 与数据库表结构一一对应,是数据库记录在内存中的映射对象。 2. 主要用于数据的持久化操作,如将数据从数据库读取到内存中封装成 PO,或将 PO 中的数据保存到数据库中。 3. 包含与数据库表字段对应的属性,通常使用 ORM(对象关系映射)框架进行数据库操作。 |
DAO层返回PO,Service层将其转换为DTO/VO再向上传递。
DO:“数据 + 行为”一体化,避免业务逻辑分散在Service层,实现高内聚。
完整的数据流转流程
- 前端传递 VO:前端页面将用户输入的数据封装成 VO 发送给后端表现层(Controller 层)。
- 表现层转换为 DTO:Controller 层接收到 VO 后,将其转换为 DTO,去除一些仅用于视图展示的信息,保留与业务逻辑相关的数据。
- 表现层将 DTO 传递给服务层:Controller 层调用服务层的方法,将 DTO 传递给服务层。
- 服务层转换为 DO:服务层接收到 DTO 后,将其转换为 DO(Domain Object)。DO 是业务领域中的对象,包含了业务逻辑和业务规则,服务层会根据业务需求对 DO 进行处理。
- 服务层调用 DAO 层:服务层执行业务逻辑后,调用 DAO(Data Access Object)层的方法进行数据持久化操作。
- DAO 层转换为 PO:DAO 层接收到 DO 后,将其转换为 PO(Persistent Object)。PO 通常与数据库表结构一一对应,DAO 层将 PO 中的数据保存到数据库中