我为什么要写这篇

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

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

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


先看看阿里是怎么约定的

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

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

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

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

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


通常的项目结构

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

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

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

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

各个目录详细介绍:

|_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包里了。


项目结构划分总结

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

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

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

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


一些注意事项

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

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

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

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

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


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

  1. web.xml文件位于web项目的目录结构中的_看完这篇,别人的开源项目结构应该能看懂了...

    我为什么要写这篇 近来,和不少初学Spring或Spring Boot的小伙伴私信交流了关于项目目录结构划分和代码分层的问题. 很多小伙伴表示网上下载下来的开源项目看不懂,项目结构和代码分层看得很蒙, ...

  2. 在阿里工作5年了,看完这篇,别人的开源项目结构应该能看懂了

    很多小伙伴表示网上下载下来的开源项目看不懂,项目结构和代码分层看得很蒙,不知道应该以一个什么样的思路去学习和吸收别人的项目. 好,今天熬夜肝了这篇文章,和大家一起来交流探讨一下,不足之处也请小伙伴们批 ...

  3. ICCV 2021 放榜!一文看尽10篇论文的开源项目(检测/分割/Transformer等)

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 前言 ICCV 2021 刚刚公布获奖结果!先恭喜各位论文被收录的同学.ICCV 2021 最终收录1617 ...

  4. 看完本篇,让你花最短的时间搞懂二极管钳位电路!

    我们工作中会遇到很多种电路,今天来说说让你少走弯路的3类二极管钳位电路.所谓钳位,就是把输入电压变成峰值钳制在某一预定的电平上的输出电压,而不改变信号. 01 钳位电路 (1)功能:将输入讯号的位准予 ...

  5. 微信支付怎么取消短信服务器,微信支付绑定了别人信息,如何解除绑定?看完这篇文章就会了!...

    原标题:微信支付绑定了别人信息,如何解除绑定?看完这篇文章就会了! 现在微信支付的使用率已经非常的高,随之而来的是微信支付的使用率也在不断提高.或许很多人都遇到过,别人的微信绑定了自己的卡,或是自己微 ...

  6. 程序员要怎么高效学习Java,大学生or小白的你看完这篇的你离BAT又近了一大步

    这篇文章大体上会从以下几个部分展开: 认清自己. 学习目的. 时间管理. 学习方法. 学习的步骤. 获取知识的途径 影响学习的几个因素 自己的心态. 外物的影响. 其他想说的 大学生的学习 一些感悟 ...

  7. 看完这篇再也不怕 Redis 面试了

    看完这篇再也不怕 Redis 面试了 0x00.前言 Redis是跨语言的共同技术点,无论是Java还是C++都会问到,所以是个高频面试点. 笔者是2017年才开始接触Redis的,期间自己搭过单机版 ...

  8. 第六十二期:看完这篇还不了解Nginx,那我就哭了!

    看完这篇还不了解Nginx,那我就哭了! Nginx 同 Apache 一样都是一种 Web 服务器.基于 REST 架构风格,以统一资源描述符(Uniform Resources Identifie ...

  9. 看完这篇文章,还不懂nginx,算我输

    看完这篇文章,还不懂nginx,算我输 参考:https://mp.weixin.qq.com/s/PeNWaCDf_6gp2fCQa0Gvng 1. Nginx产生~ Nginx 同 Apache ...

最新文章

  1. opencv-contrib配置过程
  2. 不错的linux下通用的java程序启动脚本(转载)
  3. 当代开发者的六大真实现状,你被哪一个场景“戳中”了?
  4. 9.20PMP每日一题
  5. 凝结芽孢杆菌行业调研报告 - 市场现状分析与发展前景预测
  6. Android的 EditText的inputType类型
  7. 安卓手机计算器应用java_安卓体重计算器java源程序 使用Intent在Activity间传输数据...
  8. idea git提交代码步骤
  9. github如何开启两步验证
  10. 1449异常 mysql_连接MySQL时出现1449与1045异常解决办法
  11. 计算机专业应届毕业生找工作一定要知道的面试题--必背版
  12. java消息平台_Java微信公众平台之消息管理
  13. 云豹智能发布全功能云霄DPU网卡,引领数据中心新趋势
  14. C语言编程>第一周 ③ 输入某年某月某日,判断这一天是这一年的第几天
  15. jeesite代码生成id出不来的解决方案
  16. 土地资源管理就业怎么这么难_土地资源管理就业前景怎么样
  17. 前端学习JS第八天(P102--P110)
  18. 阿里旗下多个App已接入微信支付
  19. 操作系统 - 1. 绪论
  20. QT中的TS文件与QM文件

热门文章

  1. java前端插件有哪些,前端常用插件、工具类库汇总(上)
  2. USB小风扇IC方案电路原理图免费下载
  3. Top 150 Questions - 1.4
  4. JAVA面试基础 自整理
  5. vb.net在自己的应用中嵌入谷歌地球的方法
  6. Redhat linux 安装 gcc编译器,Gcc源码包,rpm包安装方法!
  7. 【Sql Server】查询实战,实现不同班级的排行查询并且批量模拟数据进行查询测试
  8. 转:新浪给微米定下了哪些要求?
  9. Silverlight的开发工具 1
  10. Java并发编程学习笔记——volatile与synchronized关键字原理及使用