来聊聊Java项目分层规范

写在文章开头

近期和读者交流聊到项目规范,借着这个机会我们不妨聊聊主流Java项目是如何进行分层的。

在这里插入图片描述

Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源项目 Java Guide 的维护者之一,熟悉 Java 也会一点 Go ,偶尔也会在 C源码 边缘徘徊。写过很多有意思的技术博客,也还在研究并输出技术的路上,希望我的文章对你有帮助,非常欢迎你关注我的公众号: 写代码的SharkChili

因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。

在这里插入图片描述

为什么需要分层

大部分人都认为Java项目的分层无非是controllerservicemapper这3层,尽管这种规约在Java web项目几乎是默认的,有时却因为团队沟通或者需求快速迭代,导致项目中会出现以下几种情况:

  1. 接口逻辑全写在controllerservice仅做透传持久层的透传。
  2. mapper层对象直接返回到controller层,直接无视service层。
  3. controller层对象不做任何转换直接一路传到mapper层。

就笔者的个人经验而言,这种情况大部分出现在有一定开发经验老码农身上,而新人接手项目时没有经过沟通,直接照猫画虎,于是这种恶习便一路传下来,进而出现如下几个问题:

  1. 代码不易扩展。
  2. 分层效果让团队难以接受。
  3. 各层职责边界不清晰,难以复用。

分层最佳实践

阿里提出的分层规范

按照阿里的规约,对应的项目会按照如下规范进行分层:

  1. 开放接口层:封装service方法对外暴露为RPC接口或者通过web封装成HTTP接口进行网关安全控制或者流量控制等。
  2. 终端显示层:各个模板渲染并显示的层级,我们可直接通俗的理解为前端渲染的页面。
  3. web层:主要对访问控制进行转发、参数校验、逻辑调用等,也就是我们常说的controller层。
  4. service:真正逻辑处理的层级,严格来说一个controller就对应一个service,之所以用逻辑都封装在service是为了方便后续封装RPC接口时,可以通过直接调用service完成扩展。
  5. manager:通用的业务处理层级,常用于第三方平台能力封装,或者中间件、缓存方案通用处理、对多mapper进行逻辑组合,总的来说manager层提供各种原子服务接口,而service层对这些原子接口进行逻辑编排。
  6. mapper层:持久层,也就是直接和数据库交互的一层。

对应的我们给出分层的图解:

在这里插入图片描述

分层的领域模型

明确分层后,我们也需要针对各层提出领域模型规约:

  1. DO(data object):即持久层对象,所有的数据库查询后转换为Java映射的对象都以DO结尾,该层与数据表一一对应。
  2. DTO(data transfer object):持久层完成查询之后得到的DO对象service层或者manager层就需要将其转换为DTO对外传输。
  3. VO(view object)controller层返回给视图层进行渲染的对象。
  4. query:入参对象,如果超过两个则需要封装,禁止使用Map,这是强制要求。

很明显,这种做法虽然保证了层级分明,但是为了所谓的规范却耗费开发大量精力进行对象转化,明显降低了开发的效率。

在这里插入图片描述

简化分层规约

所以我们对此做一个折中,得到下面这样一个开发规约图解,其交互过程为:

  1. 入参一律使用query,进行参数校验之后,由于controller或者Tservicequery传给service或者manager
  2. servicemanager在业务处理时可直接操作mapper层的DO对象进行逻辑处理。
  3. servicemanager完成逻辑后最终封装成VO返回给上层也就是controller或者Tservice层。

由此我们既实现了规范的的分层又保证了开发的效率。

在这里插入图片描述

常见的web架构示例

基于上述的分层理论,笔者给出一个个人比较常用的项目结构,整体结构树如下所示,读者可参考自行调整使用:

    |- web-project   // 项目根目录
        |- src
            |- main                  // 业务逻辑
                |- assembly          // 基于maven assembly插件的服务化打包方案
                    |- bin           // 模块脚本(启动、停止、重启)
                    |- sbin          // 管理员角色使用的脚本(环境检查、系统检测等等)
                    |- assembly.xml  // 配置文件
                |- java              // 源代码
                    |- com
                        |- sharkchili
                            |- www
                                |- system
                                    |- annotation     // 注解
                                    |- aspect         // 面向切面编程
                                    |- config         // 配置文件POJO
                                    |- filter         // 过滤器
                                    |- constant       // 存放常量
                                    |- utils          // 工具
                                    |- exception      // 异常
                                    |- controller     // 控制层(将请求通过URL匹配,分配到不同的接收器/方法进行处理,然后返回结果)
                                    |- service        // 服务层接口
                                        |- impl       // 服务层实现
                                    |- mapper/repository // 数据访问层,与数据库交互为service提供接口
                                    |- entity/domain     // 实体对象
                                        |- dto // 持久层需要的实体对象(用于服务层与持久层之间的数据传输对象)
                                        |- vo // 视图层需要的实体对象(用于服务层与视图层之间的数据传输对象)
                                    |- *Application.java  // 入口启动类
                |- resources         // 资源
                    |- static        // 静态资源(html、css、js、图片等)
                    |- templates     // 视图模板(jsp、thymeleaf等)
                    |- mapper        // 存放数据访问层对应的XML配置
                        |- *Mapper.xml
                        |- ...
                    |- application.yml        // 公共配置
                    |- application-dev.yml    // 开发环境配置
                    |- application-prod.yml   // 生产环境配置
                    |- banner.txt    
                    |- logback.xml            // 日志配置
            |- test                  // 测试源码
               |- java               
                    |- com
                        |- sharkchili
                            |- www
                                |- system
                                    |- 根据具体情况按源码目录结构存放编写的测试用例
        |- target     // 编译打包输出目录(自动生成,不需要创建)
        |- pom.xml    // 该模块的POM文件
    |- sql            // 项目需要的SQL脚本
    |- doc            // 精简版的开发、运维手册
    |- .gitignore     // 哪些文件不用传到版本管控工具中
    |- pom.xml        // 工程总POM文件
    |- README.md      // 注意事项
External Libraries    // 相关JAR包依赖

小结

以上便是笔者对于项目分层规范的总结,希望对你有帮助。

我是 sharkchiliCSDN Java 领域博客专家开源项目—JavaGuide contributor,我想写一些有意思的东西,希望对你有帮助,如果你想实时收到我写的硬核的文章也欢迎你关注我的公众号: 写代码的SharkChili
因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。

在这里插入图片描述

参考

优秀的代码都是如何分层的?
:https://mp.weixin.qq.com/s/KL3U4mpi2-bnyFjfKNDPTw

同事问我代码结构中 Manager层是干什么的:https://juejin.cn/post/7032680627069517854

SpringBoot项目的目录结构及名规范
:https://blog.csdn.net/goodjava2007/article/details/122275079

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/602107.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[华为OD]C卷 运输时间 200 动态规划

题目: M辆车需要在一条不能超车的单行道到达终点,起点到终点的距离为N。速度快的车追上前车 后,只能以前车的速度继续行驶,求最后一车辆到达目的地花费的时间。 注意: 每辆车固定间隔1小时出发,比如第…

静态NAT

哈喽!各位小伙伴们好久不见,最近由于工作的原因断更了一段时间,不过最近我都会把这些给补上,今天我们来学习一个简单的知识——静态NAT转换。 第一章 什么是NAT技术? 网络地址转换技术NAT(Networ…

红帽发布Red Hat Enterprise Linux AI(RHEL AI)

红帽 2024 峰会正在科罗拉多州丹佛市举行…鉴于当前的时代背景,人工智能(AI)在此次峰会上占据了重要位置,因此红帽公司(Red Hat)也不甘人后宣布推出 RHEL AI。 红帽公司今天发布了 Red Hat Enterprise Lin…

优化电脑空间清理电脑占用磁盘空间垃圾

1. 清理磁盘 右下角放大镜,搜索 此电脑 点击要清理的磁盘 ,比如点击C盘,右键属性,常规选项卡,点击清理磁盘, 和点击清理系统文件 1.1 优化磁盘 右下角放大镜,搜索 此电脑 点击要清理的磁盘 &…

RUST 编程语言使构建更安全的软件变得更加容易。RUST ALL THE THINGS 需要什么?

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

基于Spring Ai 快速创建一个AI会话

文章目录 1、创建SpringBoot项目2、引入依赖3、修改配置文件4、一个简单的会话 前期准备 在OpenAI 注册页面创建帐户并在API 密钥页面生成令牌。 Spring AI 项目定义了一个配置属性,您应该将其设置为从 openai.com 获取的spring.ai.openai.api-key值 代码托管于gite…

sql查询数据语句

select * from 表名 where 列名 某个数据名字 查询某个表名中的某列是否有某个数据

基于卷积神经网络的高光谱图像分类详细教程(含python代码)

目录 一、背景 二、基于卷积神经网络的代码实现 1)建立卷积神经网络模型 2)训练函数代码 3)全图可视化 三、项目代码 一、背景 卷积神经网络(Convolutional Neural Networks, CNNs)在处理高光谱图像分类任务时&…

Mask RCNN(Mask_RCNN-master)简单部署

一.注意事项 1.本文主要是引用大佬的文章(侵权请联系,马上删除),做的工作为简单补充 二.介绍 ①简介: Mask R-CNN(Mask Region-based Convolutional Neural Network)是一种用于目标检测和语义…

两个手机在一起ip地址一样吗?两个手机是不是两个ip地址

在数字时代的浩瀚海洋中,手机已经成为我们生活中不可或缺的一部分。随着移动互联网的飞速发展,IP地址成为了连接手机与互联网的桥梁。那么,两个手机在一起IP地址一样吗?两个手机是不是两个IP地址?本文将带您一探究竟&a…

Apipost使用心得,让接口文档变得更清晰,更快捷

Idea和Apipost结合使用 Idea 安装插件Apipost-Helper-2.0 在【file】–>【settings】–>【Plugins】搜索 “Apipost-Helper-2.0”–>【install】,重启Idea 编写controller接口 在idea中编写业务功能及接口之后,在controller中鼠标【右键】单…

亚马逊Amazon商品详情和关键词搜索API接口分享

一、亚马逊Amazon商品详情API接口 亚马逊商品详情API接口是亚马逊平台为开发者提供的一项重要服务,它允许开发者通过程序调用API来获取亚马逊商品的相关数据。这个接口为获取商品数据提供了便利的途径,有助于用户进行商品搜索、商品分类以及数据分析等操…

Stable Diffusion基础:ControlNet之人体姿势控制

在AI绘画中精确控制图片是一件比较困难的事情,不过随着 ControlNet 的诞生,这一问题得到了很大的缓解。 今天我就给大家分享一个使用Stable Diffusion WebUI OpenPose ControlNet 复制照片人物姿势的方法,效果可以参考上图。 OpenPose 可以…

不得不聊的微服务Gateway

一、 什么是Gateway? 1.网关的由来 单体应用拆分成多个服务后,对外需要一个统一入口,解耦客户端与内部服务 2.网关的作用 Spring Cloud Gateway是Spring Cloud生态系统中的一员,它被设计用于处理所有微服务的入口流量。作为一…

Dice Semimetric Losses: Optimizing the Dice Score with Soft Labels

文章目录 Dice Semimetric Losses: Optimizing the Dice Score with Soft Labels摘要方法实验结果 Dice Semimetric Losses: Optimizing the Dice Score with Soft Labels 摘要 Soft Dice Loss(SDL)在医学图像领域的许多自动分割中发挥了关键作用。在过…

【数据库原理及应用】期末复习汇总高校期末真题试卷07

试卷 一、填空题(每空1分,共10分) 1.数据库管理系统在外模式、模式和内模式这三级模式之间提供了两层映象,其中 映象保证了数据的逻辑独立性。 2. 数据模型通常由 、数据操作和完整性约束三部分组…

vue 文本中的\n 、<br>换行显示

一、背景&#xff1a; 后端接口返回数据以\n 作为换行符&#xff0c;前端显示时候需要换行显示&#xff1b; demo&#xff1a; <p style"white-space: pre-wrap;">{{ info }}</p>data() {return {info: 1、优化图片\n 2、 优化时间\n}},项目上&#…

通配符证书价格350元

通配符SSL证书是一种特殊的域名SSL证书&#xff0c;这款SSL证书默认保护主域名以及主域名下的所有子域名&#xff0c;因此&#xff0c;子域名比较多的个人或者企事业单位开发者都倾向于选择通配符SSL证书来简化SSL证书管理过程&#xff0c;节省购买SSL证书的资金&#xff0c;降…

前端如何设置div可滚动,且设置滚动条颜色

在前端中&#xff0c;设置 div 为可滚动并通过 CSS 自定义滚动条的颜色并不是所有浏览器都直接支持的功能&#xff0c;因为滚动条的样式在很大程度上取决于操作系统和浏览器的默认样式。然而&#xff0c;你可以使用某些 CSS 属性来尝试自定义滚动条的外观&#xff0c;这些属性在…

JavaEE概述 + Maven

文章目录 一、JavaEE 概述二、工具 --- Maven2.1 Maven功能 仓库 坐标2.2 Maven之项目构建2.3 Maven之依赖管理 三、插件 --- Maven Helper 一、JavaEE 概述 Java SE、JavaEE&#xff1a; Java SE&#xff1a;指Java标准版&#xff0c;适用于各行各业&#xff0c;主要是Java…