04SpringBoot3项目分层及模型

分层的作用

项目分层是将不同用途的代码进行隔离,防止堆在一起成为屎山,而分为三层是前人实践后比较好的一种模式,既防止代码混合在一起,又不至于分层过多导致项目变得复杂。

编写简单逻辑的代码时可能会觉得分为三层有些冗余,但是在实际项目中,三层模式是非常有用的。在没有更好的理解前,遵循这个规则有助于后面的开发。

阿里规范

下面是阿里巴巴的《Java开发手册》中推荐的分层规范;分层结构是根据业务架构实践、结合业界分层规范与流行技术框架分析得来的。

默认上层依赖于下层,箭头关系表示可直接依赖,如:开放 API 层可以依赖于 Web 层(Controller 层),也可以直接依赖于 Service 层。

  • 开放 API 层:可直接封装 Service 接口暴露成 RPC 接口;通过 Web 封装成 http 接口;网关控制层等。
  • 终端显示层:各个端的模板渲染并执行显示的层。当前主要是 velocity 渲染,JS 渲染,JSP 渲染,移动端展示等。
  • Web 层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。
  • Service 层:相对具体的业务逻辑服务层。
  • Manager 层:通用业务处理层,它有如下特征: 1) 对第三方平台封装的层,预处理返回结果及转化异常信息,适配上层接口。 2) 对 Service 层通用能力的下沉,如缓存方案、中间件通用处理。 3) 与 DAO 层交互,对多个 DAO 的组合复用。
  • DAO 层:数据访问层,与底层 MySQL、Oracle、Hbase、OB 等进行数据交互。
  • 第三方服务:包括其它部门 RPC 服务接口,基础平台,其它公司的 HTTP 接口,如淘宝开放平台、支付宝付款服务、高德地图服务等。
  • 外部数据接口:外部(应用)数据存储服务提供的接口,多见于数据迁移场景中。

阿里的规范实际还是controller、service、dao的三层架构。

分层领域模型规约

阿里规范对模型规约是

  • DO(Data Object):此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
  • DTO(Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对象。
  • BO(Business Object):业务对象,可以由 Service 层输出的封装业务逻辑的对象。
  • Query:数据查询对象,各层接收上层的查询请求。注意超过 2 个参数的查询封装,禁止使用 Map 类 来传输。
  • VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。

POJO

POJO是Plain Old Java Object的缩写,意为普通的Java对象。它是一个简单的Java类,通常用于表示数据或实体,没有任何特定的约束或依赖于特定框架或技术。POJO类通常只包含私有属性、公共的getter和setter方法以及无参构造函数,不具有任何特殊的标记或接口。

。摘自Martin Fowler个人网站的一句话: "We wondered why people were so against using regular objects im their systems and concluded that it was because simple oljects lackeda fancy name.So we gave them one, and it's caught on very nicely." 我们疑惑为什么人们不喜欢在他们的系统中使用普通的对象,我们得到的结论是:普通的对象缺少一个响亮的名字,因此我们给它们起了一个,并且取得了很好的效果。

pojo可以是do、dto、bo、vo中的任何一种。

规约解读

  • 规范中的DO在项目中对应为po,首先因为是do作为关键字无法用于命名包,另外,po可以理解为persistant object(持久化对象),也是与数据库表一一对应的。
  • Query在以往项目并不多见,特别是禁用Map以及超过两个参数进行封装,都需要在后续实践中进行。

分层异常处理规约

在 DAO 层,产生的异常类型有很多,无法用细粒度的异常进行 catch ,使用 catch(Exception e) 方式,并 throw new DAOException(e) ,不需要打印日志,因为日志在 Manager / Service 层一定需要捕获并打印到日志文件中去,如果同台服务器再打日志,浪费性能和存储。 在 Service 层出现异常时,必须记录出错日志到磁盘,尽可能带上参数信息,相当于保护案发现场。 Manager 层与 Service 同机部署,日志方式与 DAO 层处理一致,如果是单独部署,则采用与 Service 一致的处理方式。

Web 层绝不应该继续往上抛异常,因为已经处于顶层,如果意识到这个异常将导致页面无法正常渲染,那么就应该直接跳转到友好错误页面,尽量加上友好的错误提示信息。开放接口层要将异常处理成错误码和错误信息方式返回。

相关推荐
WaaTong5 分钟前
Java反射
java·开发语言·反射
狂放不羁霸37 分钟前
idea | 搭建 SpringBoot 项目之配置 Maven
spring boot·maven·intellij-idea
九圣残炎38 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge40 分钟前
Netty篇(入门编程)
java·linux·服务器
计算机学长felix1 小时前
基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·毕业设计·交友
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐1 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。1 小时前
Spring Boot 配置文件
java·spring boot·后端
顾北川_野1 小时前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
江深竹静,一苇以航1 小时前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot