SpringBoot中各种O的分层模型
文章目录
- 领域模型中的实体类
- 概念:
- 项目中的实体类
- 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并不对应一个实体,可能仅存储实体的部分属性或加入符合传输需求的其他的属性。
凤凰架构讲课笔记
但是会有以下的问题:
简化我们的模型: