天狗实战SpringBoot+Vue(二)项目结构搭建(上)

时间:2021-09-13 00:56:33

天狗实战SpringBoot+Vue(二)项目结构搭建(上)



前言

因为可能还有很多同学还不清楚上下文,所以简单介绍一下这个专栏要做的事:

天罡老哥和狗哥(博客主页)有意从0到1带大家搭建一个SpringBoot+SpringCloud+Vue的前后端分离项目!
打造一个短小精悍、技术主流、架构规范的前后端分离实战项目!我负责后端,狗哥负责前端!
目的就是让大家通过项目实战,学到一些真东西,将所学理论落地,助力有心强大的你更快的成长!开启你的工作之旅,让开发游刃有余!

详细的后端规划后端大纲思维导图在开篇已经给出,你可以到开篇查收:基于SpringBoot+SpringCloud+Vue前后端分离项目实战 --开篇

上文带大家进行了后端开发环境的安装:天狗实战SpringBoot+Vue(一)环境安装

本文主要内容对应思维导图 二、项目结构搭建创建Maven项目三层架构说明搭建三层架构,如下图红框处。

万丈高楼平地起,打好地基是关键,所以项目结构搭建是非常重要的!很多小细节,等你收割!OK,Let’s go!

遇到问题不要怕,第四大点来解决!
天狗实战SpringBoot+Vue(二)项目结构搭建(上)

通过本文,希望你能清楚的回答以下问题:

  • 如何创建干净的Maven项目?建议如何定义Maven坐标?
  • 如何搭建三层架构?各层职责如何划分?
  • Maven如何统一定义依赖包版本? dependencyManagement是什么?有什么作用?

一、创建Maven项目

接下来,我会图文说明如何使用IDEA创建一个干净的Maven项目,只需2步!

第1步: 打开IDEA,从菜单点击File-》New-》Project,如下图:

天狗实战SpringBoot+Vue(二)项目结构搭建(上)

弹出【New Project】窗体,选择【Maven】,【Project SDK】 选择已安装的 JDK8,点击【Next】,如下图:

天狗实战SpringBoot+Vue(二)项目结构搭建(上)

第2步:命名,定义Maven坐标
关键词提前说明:

  • tg:天狗的缩写,是我和狗哥的组织名称
  • book: 图书,因为是图书相关项目,所以以book作为项目名称

天狗实战SpringBoot+Vue(二)项目结构搭建(上)

关于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】按钮,一个干净项目就创建好了,如下图:

天狗实战SpringBoot+Vue(二)项目结构搭建(上)


二、三层架构说明

不复杂的小项目,推荐使用经典的三层架构来搭建,非常易于理解,请求流向 如下图:

天狗实战SpringBoot+Vue(二)项目结构搭建(上)

落地到当前项目,各层职责说明如下:

  • 表现层: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,如下图:

天狗实战SpringBoot+Vue(二)项目结构搭建(上)

弹出的【New Module】窗体,依然是选择【Maven】,【Project SDK】 选择已安装的 JDK8,点击【Next】,如下图:

天狗实战SpringBoot+Vue(二)项目结构搭建(上)

因为是web层,所以命名为tg-book-web,其它层的Name命名也是一样的规律:tg-book-分层名称

当你修改了Name后,IDEA会自动同步修改ArtifactId和Location,GroupId保持不变,所以就没有其它修改了,如下图:

天狗实战SpringBoot+Vue(二)项目结构搭建(上)

同样的做法,依次创建以下子Module

  • tg-book-service
  • tg-book-dal
  • tg-book-common (通用工具层,放一些通用的工具类,常量等)

最终,项目的目录结构如下:
天狗实战SpringBoot+Vue(二)项目结构搭建(上)

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 StructureFile-》Settings

第一步,点击菜单File-》Project Structure,对应的各配置如下:

  • Project

天狗实战SpringBoot+Vue(二)项目结构搭建(上)

  • Modules

天狗实战SpringBoot+Vue(二)项目结构搭建(上)

  • SDKs

天狗实战SpringBoot+Vue(二)项目结构搭建(上)

第二步,点击菜单File-》Settings,对应的配置如下:

天狗实战SpringBoot+Vue(二)项目结构搭建(上)

2. Maven问题

Maven配置最好确认一下:

天狗实战SpringBoot+Vue(二)项目结构搭建(上)

另外,Maven刷新依赖,有几个入口:

  • 父项目右键-》Maven-》Reload Project
  • 父项目右键-》Run Maven-》Reimport

我最喜欢的是在最右侧的Maven选项卡,选中父项目,点上面的刷新图标,如下图:(或者右键Reload Project)

天狗实战SpringBoot+Vue(二)项目结构搭建(上)

最后

本文不仅带你实战了如何搭建项目结构,更主要的是教你学会为什么这么搭建项目,其中的原因,会遇到的问题,以及如何解决!
这也是你不管是谈毕设项目,还是面试谈实战项目,你能讲出来的亮点!
所以,还没订阅的同学,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

最后强调,必须动手实操,想实战就不要光看,到手的知识才属于你!让我了解一下大家的项目结构搭建情况,投票投票投票~~~