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

相关推荐
是小崔啊6 分钟前
开源轮子 - EasyExcel02(深入实践)
java·开源·excel
myNameGL38 分钟前
linux安装idea
java·ide·intellij-idea
青春男大40 分钟前
java栈--数据结构
java·开发语言·数据结构·学习·eclipse
HaiFan.1 小时前
SpringBoot 事务
java·数据库·spring boot·sql·mysql
我要学编程(ಥ_ಥ)1 小时前
一文详解“二叉树中的深搜“在算法中的应用
java·数据结构·算法·leetcode·深度优先
music0ant1 小时前
Idea 添加tomcat 并发布到tomcat
java·tomcat·intellij-idea
计算机徐师兄2 小时前
Java基于SSM框架的无中介租房系统小程序【附源码、文档】
java·微信小程序·小程序·无中介租房系统小程序·java无中介租房系统小程序·无中介租房微信小程序
源码哥_博纳软云2 小时前
JAVA智慧养老养老护理帮忙代办陪诊陪护小程序APP源码
java·开发语言·微信小程序·小程序·微信公众平台
大梦百万秋3 小时前
Spring Boot实战:构建一个简单的RESTful API
spring boot·后端·restful
忒可君3 小时前
C# winform 报错:类型“System.Int32”的对象无法转换为类型“System.Int16”。
java·开发语言