看完这篇,别人的开源项目结构应该能看懂了

144 篇文章 135 订阅
订阅专栏

image


我为什么要写这篇

近来,和不少初学Spring或Spring Boot的小伙伴私信交流了关于项目目录结构划分和代码分层的问题。

很多小伙伴表示网上下载下来的开源项目看不懂,项目结构和代码分层看得很蒙,不知道应该以一个什么样的思路去学习和吸收别人的项目。

好,今天熬夜肝了这篇文章,和大家一起来交流探讨一下,不足之处也请小伙伴们批评指正。


先看看阿里是怎么约定的

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

image

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

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

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

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


通常的项目结构

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

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

image

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

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

image

各个目录详细介绍:

|_annotation:放置项目自定义注解
|_aspect:放置切面代码
|_config:放置配置类
|_constant:放置常量、枚举等定义
   |__consist:存放常量定义
   |__enums:存放枚举定义
|_controller:放置控制器代码
|_filter:放置一些过滤、拦截相关的代码
|_mapper:放置数据访问层代码接口
|_model:放置数据模型代码
   |__entity:放置数据库实体对象定义
   |__dto:存放数据传输对象定义
   |__vo:存放显示层对象定义
|_service:放置具体的业务逻辑代码(接口和实现分离)
   |__intf:存放业务逻辑接口定义
   |__impl:存放业务逻辑实际实现
|_utils:放置工具类和辅助代码

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

|_mapper:存放mybatis的XML映射文件(如果是mybatis项目)
|_static:存放网页静态资源,比如下面的js/css/img
   |__js:
   |__css:
   |__img:
   |__font:
   |__等等
|_template:存放网页模板,比如thymeleaf/freemarker模板等
   |__header
   |__sidebar
   |__bottom
   |__XXX.html等等
|_application.yml       基本配置文件
|_application-dev.yml   开发环境配置文件
|_application-test.yml  测试环境配置文件
|_application-prod.yml  生产环境配置文件

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

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

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

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

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

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


项目结构划分总结

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

image

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

image

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

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


一些注意事项

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

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

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

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

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


该如何命名代码包以及划分代码包的结构
wangleimj88的专栏
06-16 318
我们的代码是因业务而生,如果没有业务也就没有代码,所以,代码首先要反应的就是业务,而实现业务的具体手段则要隐藏在背后。 在继续浏览下面的内容之前,请先回答一个问题,当用IDE首次打开一个陌生的工程后,让你对它产生初始认知的是什么?what?工程名?好吧,前提是这个工程名不是几个单词的首字母缩写。README?你确定每个项目都有这个文件?即使有,里面信息的用处又有多大呢。而我的回答则已经在本文的题目中了。 代码包是我们人民群众喜闻乐见的一种划分代码整体结构的工具,用好它有助于明确业
PO、VO、POJO、DTO、DAO、DTO、Service包等常见包的理解
qq_21245627的博客
03-05 1053
POJO POJO(Plain Ordinary Java Object),简单的Java对象,名字强调它是一个普通的java对象。 POJO只有private属性以及这个属性的public的get和set方法,只能装载数据,也不能实现接口。 POJO不是JavaBean,不承担任何特殊的角色,也不实现任何接口。 PO PO(Persistent Object)持久化对象,是与数据库中表相对应的...
通常一个开源项目中会包含哪些文件?
weixin_44943389的博客
06-21 491
构建文件:一些项目可能包含用于构建、编译或打包项目的文件。常见的文档文件类型包括README.md(通常是项目的入口点)、LICENSE(许可证文件,规定项目的使用条款)、CONTRIBUTING.md(贡献指南)等。这些文件的扩展名和格式会根据项目的要求而有所不同,例如,.ini、.json、.yaml等。测试文件:开源项目通常包含一些用于测试代码的文件,以确保代码的质量和正确性。源代码文件:这些文件包含项目的实际源代码,通常以编程语言特定的文件扩展名(例如,.py、.java、.cpp等)命名。
开源项目,毕业设计
热门推荐
qq_40831778的博客
10-08 1万+
自己在网上找的开源项目,比较好分享给大家 热门开源项目(包含小四轴、智能手环、光立方、智能车、防丢器等项目) 号外!号外!(搞四轴,有这套就足够了!)科研级别的小四轴STM32F4芯片支持WIFI且android手机控制自适应控制就是牛掰! 该飞机面向有科研和强烈学习意向的小伙伴们使用,如果只是想玩的话你肯定不会喜欢这套四轴的,主要设计思想是提供一个高性能的控制和姿态算法验证平台,因此...
java中POJO、VO、DTO、Entity的区别和使用
helam的专栏
04-27 1604
java代码开发时,什么情况下才创建POJO、VO、DTO、Entity包,感觉有点混乱,从字义上理解: 1、POJO(Plain Ordinary Java Object无规则简单Java对象) 基本没定义这种名字的包名 2、VO(View Object视图层对象) 接口参数或页面里的参数,可以定义相关类,放到vo包下 3、Entity(实体类,对应数据表结构) 做orm映射 4、...
在线教育风口已来,这几个开源项目不能错过 | Gitee 项目推荐
01-07
Gitee 上也有很多关于在线教育的开源项目,比如下面这五个,一起来看看吧。 1、项目名称:学之思在线考试系统 项目简介:学之思在线考试系统是一款 java + vue 的前后端分离的考试系统。主要优点是开发、部署简单...
开源数据结构:全球开源项目中使用的数据结构
02-05
本篇文章将深入探讨这些开源数据结构,以及它们在实际项目中的应用。 一、数据结构的基本概念 数据结构是计算机存储、组织数据的方式,它不仅包括数据的存储,还包括数据的操作和访问。常见的数据结构有数组、链表...
10个你能参与并学习的Java开源项目
01-20
如果你正在寻找有趣的 Java 项目想参与和贡献,那么请继续阅读这篇文章。这篇博文是 Java 画廊(Java Gallery)中的一部分,在Java画廊栏目下我介绍了一些有趣的Java项目给我们的读者。成为 Java 开发团队中的一员并...
原神混池模拟器-蒙德篇-项目开源
最新发布
04-05
根据游戏《原神》中4.5版本上半卡池中的集录祈愿卡池设计的一款模拟器,用于模拟该集录祈愿...该文件为该C#项目的项目开源,下载后为整的资源与源代码,项目内容不能、不允许用于商业等盈利行为,仅可用于个人学习。
Java最著名的开源项目
04-05
Java最著名的开源项目开源项目介绍,简单的介绍,开拓视野。
MyBeacon代码包
07-16
这个代码包是博客http://blog.csdn.net/future_challenger/article/details/37882349的附属代码。其中包括了iBeacon的简单实现,而且是基于Swift的。
代码包.rar
10-21
互动媒体技术作业,动态图形临摹,要有一件临摹的作品,还要至少一件拓展的作品
Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分
文文的博客
04-22 455
转载自:江湖小虾文章 PO: 持久对象 (persistent object),po(persistent object)就是在Object/Relation Mapping框架中的Entity,po的每个属性基本上都对应数据库表里面的某个字段。全是一个符合Java Bean规范的纯Java对象,没有增加别的属性和方法。持久对象是由insert数据库创建,由数据库delete删除的。基本上持久对象生命周期和数据库密切相关。 VO: 值对象(Value Object),通常用于业务层之间的数据传递,和PO
开发项目架构入门——源代码的组织方法
陆上溪流
08-21 732
开发项目架构入门——源代码的组织方法 一个软件开发项目中的代码是如何组织的呢? 如果需要对不同功能的源代码文件进行合理组织,以便于灵活应对未来需求变化,需要开发者在系统设计之初就重视代码的结构组织管理。这方面有一些可以借鉴的工作,比如蚂蚁金服面向服务的 SOFA 中台框架中的代码组织方法。尽管没有开源,但网上还是能找到一些相关资料。 SOFA 框架中一个项目的代码结构 SOFA 将代码分为了5个有...
代码包结构分析工具JDepend的使用方法
qysh123的专栏
01-23 5121
JDepend可以对Java软件包结构质量进行分析,已经有很多文章介绍其基本作用和能够计算的指标了,这里我就不详细总结,感兴趣的朋友可以参看如:http://blog.csdn.net/hantiannan/article/details/4641290 这里的介绍。 我主要总结一下其他文章没有介绍到的部分。首先,JDepend可以计算的指标都出自于这本书: Martin, Robert Ce
简单源代码包的制作
weixin_34413802的博客
11-02 261
简单源代码包的制作本文以“hello world”程式为例,简单说明linux下源代码包(.tar.gz)的制作。当然,本身把hello world制作成源代码包是没什么意义的。在此,谨以说明源代码包的制作过程。 首先,确保您的系统装有以下GNU软件: Automake Autoconf m4 perl libtool 1.新建一目录,将您的源代码...
github上的文档结构学习
https://github.com/Wheeeeeeeeels
11-12 775
开源项目目录规范 此为前端开发团队遵循和约定的开源项目目录规范,意在实现开源项目目录结构的一致性。 说明 文档中使用的关键字「MUST」,「MUST NOT」,「REQUIRED」,「SHALL」,「SHALL NOT」,「SHOULD」,「SHOULD NOT」,「RECOMMENDED」,「MAY」和「OPTIONAL」在RFC2119中被说明。 还未定稿,对规范中提及
Java工程中几种常见的包:PO,VO,DAO,BIZ,DTO,Service,ServiceImpl
呆萌大叔的博客
05-11 5882
一、PO:persistant object 持久对象,是与数据库中的表相映射的Java对象。最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。 二、VO:value object值对象。通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要。 三、POJO:plai
Google开源项目风格指南详解:C++代码结构与实践
Google开源项目风格指南是Google内部遵循的一套编码规范和最佳实践,它旨在确保项目的代码质量和一致性。该指南涵盖了多个方面,包括但不限于文件命名、注释、宏定义、头文件包含、函数声明与实现、模块化结构以及...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交

博客专家认证

151
原创
6587
点赞
2万+
收藏
1万+
粉丝
关注
私信
写文章

分类专栏

  • 技术分享 144篇

最新评论

  • 如期而至!JetBrains全新UI正式官宣标配!

    云飞扬: 也可以用传统UI啊,我现在就是用的2024.1传统UI

  • 如期而至!JetBrains全新UI正式官宣标配!

    qq_47007744: 我用的是2024.1版本的 在项目切换时,Git会丢失掉需要重新才能解决,希望这个问题能解决掉表情包

  • 如期而至!JetBrains全新UI正式官宣标配!

    biomooc: indeed, 巨硬挺适合我的审美的

  • 如期而至!JetBrains全新UI正式官宣标配!

    程序员胡默默: 好像2024版本第一次的有bug,有时候点击工程有的类打不开,需要重启才可以,也不知道是啥问题,然后我又卸载重新装回23版本了

  • 如期而至!JetBrains全新UI正式官宣标配!

    营赢盈英: 不要整些花里胡哨

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 如期而至!JetBrains全新UI正式官宣标配!
  • 麻了!一觉醒来,代码全挂了。。
  • 再见了!这个陪伴我7年的软件!
2024年7篇
2023年15篇
2022年4篇
2021年19篇
2020年36篇
2019年13篇
2018年58篇

目录

目录

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码石岩百度标王坪地百度标王沙井网页设计南澳关键词按天扣费惠州seo宝安网站推广系统罗湖关键词排名包年推广布吉优秀网站设计南山品牌网站设计永湖企业网站设计爱联seo网站优化松岗网站搜索优化坪山seo排名深圳英文网站建设广州优秀网站设计沙井百度关键词包年推广大芬建网站布吉SEO按天收费龙岗seo优化光明优化龙华建网站石岩百度标王坂田网站建设设计同乐百度网站优化排名宝安网站优化排名罗湖网站设计福田百度标王东莞百姓网标王推广大鹏网站推广方案塘坑seo排名歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化