本文目录
前言
因为可能还有很多同学还不清楚上下文,所以简单介绍一下这个专栏要做的事:
天罡老哥和狗哥(博客主页)有意
从0到1
带大家搭建一个SpringBoot+SpringCloud+Vue
的前后端分离项目!
打造一个短小精悍、技术主流、架构规范的前后端分离实战项目!我负责后端,狗哥负责前端!
目的就是让大家通过项目实战,学到一些真东西,将所学理论落地,助力有心强大的你更快的成长!开启你的工作之旅,让开发游刃有余!
详细的后端规划和后端大纲思维导图在开篇已经给出,你可以到开篇查收:基于SpringBoot+SpringCloud+Vue前后端分离项目实战 --开篇。
上文带大家进行了后端开发环境的安装:天狗实战SpringBoot+Vue(一)环境安装
本文主要内容对应思维导图 二、项目结构搭建:创建Maven项目、三层架构说明、搭建三层架构,如下图红框处。
万丈高楼平地起,打好地基是关键,所以项目结构搭建是非常重要的!很多小细节,等你收割!OK,Let’s go!
遇到问题不要怕,第四大点来解决!
通过本文,希望你能清楚的回答以下问题:
- 如何创建干净的Maven项目?建议如何定义Maven坐标?
- 如何搭建三层架构?各层职责如何划分?
- Maven如何统一定义依赖包版本? dependencyManagement是什么?有什么作用?
一、创建Maven项目
接下来,我会图文说明如何使用IDEA创建一个干净的Maven项目,只需2步!
第1步: 打开IDEA,从菜单点击File-》New-》Project
,如下图:
弹出【New Project】窗体,选择【Maven】,【Project SDK】 选择已安装的 JDK8,点击【Next】,如下图:
第2步:命名,定义Maven坐标
关键词提前说明:
-
tg
:天狗的缩写,是我和狗哥的组织名称 -
book
: 图书,因为是图书相关项目,所以以book作为项目名称
关于Maven坐标相关的GroupId、ArtifactId、Version说明(
这里有重点!!!
):
-
GroupId:组织名称:对应Maven坐标 groupId
规范做法是
单词间以.
分隔,是后面定义的package
的前缀。例如:我定义的是:org.tg 那么对应 package 就会是 org.tg.*
额外说明: org是非营利组织,像org.springframe; 公司组织一般以com开头。
-
ArtifactId:项目名称:对应Maven坐标的 artifactId
规范做法是
多个单词以-
分隔,例如: tg-book -
Version:版本号:对应Maven坐标的 version
以SNAPSHOT结尾的是快照版本,开发期间使用的版本,可以随时覆盖替换,方便迭代快速更新。
正式版一般是RELEASE结尾或者只有一个单纯的版本号,发布以后不能覆盖替换!
Name和Location说明:
- Name:项目名称,通常和ArtifactId保持一致即可。
- Location:项目保存的位置,最后的子路径通常与Name保持相同。
以上都是通常建议的做法,当然,如果你不按这么做,也不会报错。
最后,点击【Finish】按钮,一个干净项目就创建好了,如下图:
二、三层架构说明
不复杂的小项目,推荐使用经典的三层架构来搭建,非常易于理解,请求流向 如下图:
落地到当前项目,各层职责说明如下:
-
表现层:web层,提供controller,处理http请求,提供给前端的API;
-
业务逻辑层:service层,和业务相关,主要处理业务逻辑编排;
-
数据访问层:dal层,做数据访问,主要使用Mybatis与MySQL交互数据。
三层架构区分层次的目的是为了“
高内聚,低耦合
”。职责明确,避免调用混乱,让开发人员分工更明确,将精力更专注于应用系统核心业务逻辑的分析、设计和开发,加快项目的进度,提高了开发效率,有利于项目的更新和维护工作。
三、搭建三层架构
先思考一个问题:我们将所有代码都写在一个Project里可不可以?
当然可以!不会报错,程序也能正常运行,但从设计上来说,不推荐!
-
理由:
放在一起,由于层一层之间的界限不清晰,容易出现调用混乱,像web层直接调了dal层,dal层调了service层等等很多问题……因为项目并不会报错,只是乱而已。。。,久而久之项目就会越来越"腐败"
,最终难以维护,这也就和分层的初衷不符,达不到高内聚,低耦合
!这里插一下,程序员应知:“破窗理论” 和 “童子军军规”,值得细品!
所以,不能依靠开发人员严格自律,那多累啊,所以需要从架构设计下点功夫,让开发更轻松,可靠的做法:应从架构设计上做到层与层之间的隔离!
-
落地的实现:
- 对每一层创建一个Maven项目
- 对层与层之间的依赖关系通过pom指定,约束你不能乱来!
-
引申出来的问题:
如果分为多个Maven项目,那就涉及到
包依赖版本
问题,如何解决?通常的做法是会定义一个Maven父项目,统一管理包依赖版本!
OK,那让我们一一落地吧!
1. 创建父子Maven项目
我们以上面创建的tg-book
作为父项目,接下来演示创建web层
的子项目:
点击选择:父项目上右键-》New-》Module
,如下图:
弹出的【New Module】窗体,依然是选择【Maven】,【Project SDK】 选择已安装的 JDK8,点击【Next】,如下图:
因为是web层,所以命名为tg-book-web
,其它层的Name命名也是一样的规律:tg-book-分层名称
。
当你修改了Name后,IDEA会自动同步修改ArtifactId和Location,GroupId保持不变,所以就没有其它修改了,如下图:
同样的做法,依次创建以下子Module
- tg-book-service
- tg-book-dal
- tg-book-common (通用工具层,放一些通用的工具类,常量等)
最终,项目的目录结构如下:
2. 定义依赖关系
我们根据在《三层架构说明》处说明的请求流向和各层职责,来落地处理依赖关系。
2.1 父项目统一管理依赖
首先,我们先将本项目的依赖放到父项目里统一管理,在父pom.xml
中增加dependencyManagement
节点,配置如下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.tg</groupId>
<artifactId>tg-book-web</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.tg</groupId>
<artifactId>tg-book-service</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.tg</groupId>
<artifactId>tg-book-dal</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.tg</groupId>
<artifactId>tg-book-common</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
dependencyManagement说明:
Maven中的dependencyManagement
只是管理依赖版本,定义时不会真正导入,这是和直接定义dependencies
的区别!
作用:在其中声明所依赖包的版本信息后,其所有子项目引入此依赖jar包时,无需指定版本号。
2.2 子项目增加依赖
由于Maven是会继承
的,所以我们从下至上
定义:
-
tg-book-common
因为common是为大家服务的,所以它不能依赖本项目中的任何项目。
-
tg-book-dal
依赖common。
具体做法:在
pom.xml
中,增加dependencies
,引入tg-book-common的依赖:<dependencies> <dependency> <groupId>org.tg</groupId> <artifactId>tg-book-common</artifactId> </dependency> </dependencies>
注意,这里就不用指定版本号了,因为由
父pom的dependencyManagement
统一管理! -
tg-book-service
依赖dal和common,因为会继承,dal里已经引入common,所以我们只引入dal即可!
具体做法:在
pom.xml
中,增加dependencies
,引入tg-book-dal的依赖:<dependencies> <dependency> <groupId>org.tg</groupId> <artifactId>tg-book-dal</artifactId> </dependency> </dependencies>
-
tg-book-web
依赖service和common,同理,因为会继承,所以我们只引入service即可!
具体做法:在
pom.xml
中,增加dependencies
,引入tg-book-service的依赖:<dependencies> <dependency> <groupId>org.tg</groupId> <artifactId>tg-book-service</artifactId> </dependency> </dependencies>
四、常见问题QA
1. JDK问题
如果出现版本问题,找两个地方确认配置:File-》Project Structure
和File-》Settings
第一步,点击菜单File-》Project Structure
,对应的各配置如下:
- Project
- Modules
- SDKs
第二步,点击菜单File-》Settings
,对应的配置如下:
2. Maven问题
Maven配置最好确认一下:
另外,Maven刷新依赖,有几个入口:
- 父项目右键-》Maven-》Reload Project
- 父项目右键-》Run Maven-》Reimport
我最喜欢的是在最右侧的Maven选项卡,选中父项目,点上面的刷新图标,如下图:(或者右键Reload Project)
最后
本文不仅带你实战了如何搭建项目结构,更主要的是教你学会为什么这么搭建项目,其中的原因,会遇到的问题,以及如何解决!
这也是你不管是谈毕设项目,还是面试谈实战项目,你能讲出来的亮点!
所以,还没订阅的同学,Come on! 请随我一起开启有趣的程序人生。。。
订阅SpringBoot实战专栏入口 :https://blog.csdn.net/scm_2008/category_12236048.html
订阅Vue实战专栏入口 :https://blog.csdn.net/xingyu_qie/category_12222258.html
另外,别忘了关注天哥:天罡gg ,发布新文不容易错过: https://blog.csdn.net/scm_2008
最后强调,必须动手实操,想实战就不要光看,到手的知识才属于你!让我了解一下大家的项目结构搭建情况,投票投票投票~~~