SpringBoot中各种O的分层模型

时间:2024-09-29 17:12:54

文章目录

  • 领域模型中的实体类
  • 概念:
  • 项目中的实体类
  • rest api中的model, vo, dto之间的关系
  • 凤凰架构讲课笔记

设计模式的单一职责:
各种XXO

  • Pojo: 普通Java类
  • Dao:Database Access Object: 专门用来访问数据库的对象
  • TO:transfer Object: 专门用来传输数据的对象
  • VO:View/Value Object: 值对象,视图对象(专门用来封装前端数据的对象)
    阿里开发手册中写的工程结构如下:
    在这里插入图片描述

⚫ 开放 API 层:可直接封装 Service 接口暴露成 RPC 接口;通过 Web 封装成 http 接口;网关控制层等。
⚫ 终端显示层:各个端的模板渲染并执行显示的层。当前主要是 velocity 渲染,JS 渲染,JSP 渲染,移动端展示等。
⚫ Web 层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。
⚫ Service 层:相对具体的业务逻辑服务层。
⚫ Manager 层:通用业务处理层,它有如下特征

  • 1)对第三方平台封装的层,预处理返回结果及转化异常信息,适配上层接口。
  • 2)对 Service 层通用能力的下沉,如缓存方案、中间件通用处理。
  • 3)与 DAO 层交互,对多个 DAO 的组合复用。

⚫ DAO 层:数据访问层,与底层 MySQL、Oracle、Hbase、OceanBase等进行数据交互。
⚫ 第三方服务:包括其它部门 RPC 服务接口,基础平台,其它公司的 HTTP 接口,如淘宝开放平台、支付宝付款服务、
高德地图服务等。
⚫ 外部数据接口:外部(应用)数据存储服务提供的接口,多见于数据迁移场景中。
后端层次划分:
 在这里插入图片描述
 后端分包:
 在这里插入图片描述
 POJO与JavaBean:
 在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
POJO就是简单的私有属性,加get/set方法,

JavaBean,就是会做一些逻辑处理,包括接收事件,和查找事件等

在这里插入图片描述
POJO的使用:

在这里插入图片描述
在项目应用中,VO对应于页面上需要显示的数据(表单),DO对应于数据库中存储的数据(数据表),DTO对应于除二者之外需要进行传递的数据。

领域模型中的实体类

领域模型中的实体类分为四种类型:VO、DTO、DO、PO,各种实体类用于不同业务层次间的交互,并会在层次内实现实体类之间的转化。

业务分层为:视图层(VIEW+ACTION),服务层(SERVICE),持久层(DAO)

相应各层间实体的传递如下图:
在这里插入图片描述
实际项目中我们并没有严格遵循这种传递关系,但这种和业务层次的关联对我们理解各实体类的作用是有帮助的

概念:

VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。

DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。

DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。

PO(PersistentObject):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。

项目中的实体类

项目中常见的实体类有VO,DO和DTO,命名规则也常是以相应字符串结尾,如*VO.Java。

但是DTO不总是遵循这个规则,而通常与他的用途有关,如写成*Query.java,表示存储了一个查询条件。

项目中实体类出现的业务层次也没有这么严格,例如我们可以在视图层就组装一个DO,也可以将一个VO从持久层传出来,所以与业务分层相关联的划分方法显得有些冗余。

从项目代码中抽象出的理解是:VO对应于页面上需要显示的数据,DO对应于数据库中存储的数据,DTO对应于除二者之外需要进行传递的数据。

rest api中的model, vo, dto之间的关系

model:用于接收数据库中的数据,通过mybatis 的ORM对象关系映射来获取数据

service主要是来处理业务逻辑,返回数据(数据的返回不会做如何处理,只是将model中的数据进行整合然后保证返回的数据完整性,比如在service中返回一个user model 和一个 role model,会提供一个UserROleBO来接收user 和 role的数据)

dto:dto主要是用来作为传输数据,在我们的项目中是用来接收远程调用接收响应的对象

vo:主要是我们本地调用的对象, 用来向用户显示(BO中的user和role只需要显示userName和roleName,会通过VO来进行显示)

在实际的开发中,VO对应页面上需要显示的数据,DO对应于数据库中储存的数据(表列,也就是model),DTO对应于除二者之外需要传递的数据。

DTO(data transfer object):数据传输对象,以前被称为值对象(VO:value object),作用仅在于在应用程序的各个子系统间传输数据,在表现层展示。

与POJO对应一个数据库实体不同,DTO并不对应一个实体,可能仅存储实体的部分属性或加入符合传输需求的其他的属性。

凤凰架构讲课笔记

在这里插入图片描述
但是会有以下的问题:
在这里插入图片描述
简化我们的模型:
在这里插入图片描述