无障碍阅读他人开源项目结构:看完本文,你将信心满满

news2025/1/13 13:57:52
46d5d2f7c1e2b09f339d5365aba6ef1e.jpeg

先看看阿里是怎么约定的

我印象中,以前在看《阿里巴巴Java开发手册》时,好像有关于工程结构和应用分层相关的内容,于是我回翻了一下,果然有:

a0cfb3443340c2e3215604d4ef044ca1.jpeg

它这里面讲的内容大概就是:关于一个正常的企业项目里一种通用的项目结构和代码层级划分的指导意见。

按这本书上说的,一般分为如下几层:

  • 开放接口层
  • 终端显示层
  • Web 层
  • Service 层
  • Manager 层
  • DAO 层
  • 外部接口或第三方平台

由于书中的篇幅关系,它这地方讲得比较笼统了,估计初学者看了还是会懵,所以接下来结合实际项目代码结构,来唠一唠具体的项目结构和代码分层。

通常的项目结构

首先说在前面的是:这东西并没有一套通用的标准,不同公司或者团队的使用习惯和规范也不尽相同。

我们就以当下非常火热的Spring Boot典型项目结构为例,创建出来的项目应该总体分为三大层:

30e8d2f846cb9aefe3eeba3217e67e59.jpeg
  • 项目根目录/src/main/java:放置项目Java源代码
  • 项目根目录/src/main/resources:放置项目静态资源和配置文件
  • 项目根目录/src/test/java:放置项目测试用例代码

而位于 /src/main/java目录下的Java源代码的组织结构大家比较关心,这地方也只能给出一个通常典型的结构,毕竟不同项目和团队实践不一样,稍许有区别,但整体安排应该差不多。而且如果是多模块的项目的话,下面的结构应该只对应其中一个模块,其他模块的代码组织也大致差不多。

474049f9363b49b227309742a3922a5d.jpeg

各个目录详细介绍:

0a00f0f5b5da3ca3a4d7ab86d3331720.jpeg

然后接下来 /src/main/resources目录,里面主要存放静态配置文件和页面静态资源等东西:

77f1cd143c72e73ab1cbc5edde5a3773.jpeg

当然,这地方估计有一个很多人都会纠结的关于 DTO/VO/DO等数据模型定义的区分。

这在《阿里巴巴Java开发手册》中倒是做了一个所谓的严格区分,那本书上是这样去定义的:

  • DO(DataObject):与数据库表结构一一对应,通过DAO层向上传输数据源对象。
  • DTO(DataTransferObject):数据传输对象,Service或Manager向外传输的对象。
  • BO(BusinessObject):业务对象。由Service层输出的封装业务逻辑的对象。
  • AO(ApplicationObject):应用对象。在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
  • VO(ViewObject):显示层对象,通常是Web向模板渲染引擎层传输的对象。
  • Query:数据查询对象,各层接收上层的查询请求。注意超过2个参数的查询封装,禁止使用Map类来传输。

老实讲,看到这么多对象的定义,我也是很蒙的。实际项目开发时,我觉得没有必要刻意照搬去定义这么多层对象,这样后续做对象转换工作都能烦skr人。

出于简单起见,我个人觉得,只要保证业务逻辑层 Service和数据库 DAO层的操作对象严格划分出来,确保互相不渗透,不混用,问题应该就不大。

比如在我上面举例的这个项目的代码结构中, Service层处理的对象都定义在了 dto包里,而 DAO层处理的对象都放在了 entity包里了。

项目结构划分总结

如果从一个用户访问一个网站的情况来看,对应着上面的项目代码结构来分析,可以贯穿整个代码分层:

e23da41b742f539f541527b7eac2bd34.jpeg

对应代码目录的流转逻辑就是:

f99cb067e0bc1d1c5c0ef01ccd9af8ff.jpeg

我想,应该看得比较清楚了吧。

所以,以后每当我们拿到一个新的项目到手时,只要按照这个思路去看别人项目的代码,应该基本都是能理得顺的

一些注意事项

1、 Contorller层参数传递建议不要使用 HashMap,建议使用数据模型定义

2、 Controller层里可以做参数校验、异常抛出等操作,但建议不要放太多业务逻辑,业务逻辑尽量放到 Service层代码中去做

3、 Service层做实际业务逻辑,可以按照功能模块做好定义和区分,相互可以调用

4、功能模块 Service之间引用时,建议不要渗透到 DAO层(或者 mapper层),基于 Service层进行调用和复用比较合理

5、业务逻辑层 Service和数据库 DAO层的操作对象不要混用。 Controller层的数据对象不要直接渗透到 DAO层(或者 mapper层);同理数据表实体对象 Entity也不要直接传到 Controller层进行输出或展示。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目中拖拽元素,可以使用html的draggable属性,当然也可以用第三方插件interact

项目中拖拽元素&#xff0c;可以使用html的draggable属性&#xff0c;当然也可以用第三方插件interact 一、安装二、引用三、使用 一、安装 npm install interactjs二、引用 import interact from interactjs三、使用 <div class"drag_box"> &…

Linux虚拟网络设备—Veth Pair

veth是Virtual Ethernet Device的缩写&#xff0c;是一种成对出现的Linux虚拟网络接口设备。它最常用的功能是用于将不同的Linux network namespaces 命名空间网络连接起来&#xff0c;让二个namespaces之间可以进行通信。我们可以简单的把veth pair理解为用一根网线&#xff0…

2023年【加氢工艺】免费试题及加氢工艺在线考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 加氢工艺免费试题考前必练&#xff01;安全生产模拟考试一点通每个月更新加氢工艺在线考试题目及答案&#xff01;多做几遍&#xff0c;其实通过加氢工艺在线考试很简单。 1、【单选题】《中华人民共和国职业病防治法…

ES6初步了解Symbol的用法

ES6中为我们新增了一个原始数据类型Symbol&#xff0c;让我为大家介绍一下吧&#xff01; Symbol它表示是独一无二的值 Symbol要如何创建 第一种创建方式&#xff1a; let sy Symbol()第二种创建方式&#xff1a; let sy Symbol.for()具体独一无二在哪呢&#xff1f;它们的地…

阻抗导纳控制理解

书籍《Modern Robotics - Mechanics , Planning, and Control》中关于阻抗控制和导纳控制的部分&#xff1a; 下面结合上边的内容谈一谈我对导纳控制的理解。 1、质量-弹簧-阻尼 首先&#xff0c;不论是阻抗控制&#xff0c;还是导纳控制&#xff0c;他们同根同源&am…

计算机网络_03_tcp/ip四层模型

文章目录 1.为什么会有tcp/ip?2.tcp/ip是什么?3.为什么会有tcp/ip四层模型?4.tcp/ip四层模型介绍 1.为什么会有tcp/ip? 早期的计算机(计算机网络没有出现之前)几乎都是各自为战, 各种操作系统厂家百花齐放, 市面上的大部分计算机使用的都是不同的操作系统, 为每个人提供定…

【rk3568-linux】 rk3568x_linux-- 编译说明

概述 一个好的安装教程能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 开发环境 开发环境&#xff1a;ubuntu18 文章目录 概述开发环境一、选择型号二、全自动编译三、…

基于蜉蝣算法的无人机航迹规划-附代码

基于蜉蝣算法的无人机航迹规划 文章目录 基于蜉蝣算法的无人机航迹规划1.蜉蝣搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用蜉蝣算法来优化无人机航迹规划。 1.蜉蝣搜索算法 …

一个工作三年的前端是如何做性能优化的

你是怎么做性能优化的&#xff1f;关于这一个问题&#xff0c;也是我们前端开发程序员经常会讨论到的问题&#xff0c;接下来这篇文章将总结一下前端方面的性能优化及方式。 为什么要做性能优化 性能优化是为了提高网页的加载速度和相应速度&#xff0c;给用户带来更好的体验…

asp.net在线考评系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net在线考评系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发 asp.net 在线考评系统 二、功能介绍 本…

Python自动处理pptx:新建、另存、添加幻灯片、添加标题、插入文本图片图形、提取文本

Python-pptx库是一个用于创建、更新和读取Microsoft PowerPoint .pptx 文件的Python库。它允许我们使用Python脚本自动化PowerPoint文件的创建、更新和读取操作&#xff0c;是一个非常方便自动化处理PPTX的工具。 安装 pip install python-pptx创建 from pptx import Prese…

记一次公司项目上的常规渗透测试

授权项目上的渗透测试&#xff0c;漏洞有网站弱口令—存储型XSS—文件上传。 前言 本文由知识星球《网络安全情报攻防站》星友堂主投稿&#xff0c;感谢投稿。授权项目下常规的渗透测试。欢迎朋友们积极投稿&#xff0c;投稿有奖励。天冷了来领奶茶钱 正文 网站首页 首页啥都没…

前端koa搭建服务器(保姆级教程)——part1

目录 koa简介前端项目搭建koa环境第一步&#xff1a;新建项目第二步&#xff1a;环境初始化&#xff0c;安装依赖初始化项目&#xff0c;生成package.json文件安装koa依赖安装koa-router 路由管理依赖安装dotenv 环境变量依赖安装nodemon 热启动依赖 第三步&#xff1a;代码调用…

黄金代理这么多,怎么选?

目前&#xff0c;现货黄金代理已成为了市场中成熟的模式&#xff0c;我们只要在搜索引擎上搜索如何在市场中开户&#xff0c;会搜到各种各样的黄金代理&#xff0c;其中更是不乏服务非常优秀的。部分投资者早就接受了黄金代理的存在&#xff0c;并且率先开始在黄金代理中进行开…

【单调栈】503. 下一个更大元素 II、42. 接雨水

提示&#xff1a;努力生活&#xff0c;开心、快乐的一天 文章目录 503. 下一个更大元素 II&#x1f4a1;解题思路&#x1f914;遇到的问题&#x1f4bb;代码实现&#x1f3af;题目总结 42. 接雨水&#x1f4a1;解题思路&#x1f914;遇到的问题&#x1f4bb;代码实现&#x1f3…

反射Java

反射是获取摸个类的所有对象 构造器 &#xff1a;成员变量&#xff1a; 成员方法 获取方式 package Reflect;//获取class类的对象public class Test1Clacc {public static void main(String[] args)throws Exception {Class c1Student.class;System.out.println(c1.getName(…

神奇代码备份恢复工具逸事与操作指南

文章目录 一&#xff0c;序二&#xff0c;逸事三&#xff0c;为什么今天要提这个工具四&#xff0c;操作界面1. 文章发表者备份项目步骤2. 文章发表者恢复项目操作步骤3. 文章阅读者恢复项目步骤 五&#xff0c;附件1. 示例备份文件2. 神奇代码备份恢复工具源码备份 一&#xf…

淘宝商品详情API接口(标题|主图|SKU|价格|商品销量)

Taobao.item_get-获得淘宝商品详情接口&#xff0c;淘宝商品详情数据接口是淘宝开放平台提供的一种API接口&#xff0c;通过调用该接口&#xff0c;可以获取淘宝商品详情信息。该接口支持多种编程语言&#xff0c;包括Java、PHP、Python等。在使用淘宝商品详情API接口时&#x…

你知道有哪些好用的数据分析工具类软件?

前言 俗话说&#xff0c;工欲善其事&#xff0c;必先利其器。工匠想要使他的工作做好&#xff0c;一定要先让工具锋利。比喻要做好一件事&#xff0c;准备工具非常重要。对于数据分析人员来说是一样的&#xff0c;想要提高工作效率&#xff0c;也需要选择好自己的工具&#xf…

2023年中国监控光端机优点、市场规模及发展前景分析[图]

监控光端机是一种用于光纤通信网络的设备&#xff0c;用于连接光纤到用户设备&#xff08;如计算机、路由器等&#xff09;。监控光端机行业涉及制造、销售和维护这些设备&#xff0c;以确保高速、稳定的光纤通信连接&#xff0c;适用于家庭、企业和数据中心等不同应用场景。 …