SpringBoot教程(二十九) | SpringBoot多模块构建及打包
一、多模块的由来
随着软件项目的不断发展,代码量不断增加,项目结构也变得越来越复杂。为了应对这种复杂性,通过多模块开发,可以降低耦合度、提高开发效率、便于管理和部署,并提高代码复用性。
二、多模块的划分方式
在Spring Boot项目中,多模块的划分可以根据不同的需求进行,常见的划分方式包括:
- 按业务模块划分:将一个大型系统按照不同的业务模块进行划分,每个模块可以独立开发、测试、部署和维护。
- 按功能模块划分:将一个系统按照不同的功能模块进行划分,每个模块负责完成一个特定的功能。
- 按技术组件划分:将一个系统按照不同的技术组件进行划分,每个模块可以包含一个或多个技术组件,如数据库连接、消息队列、缓存框架等。
- 按层次划分:将一个系统按照不同的层次进行划分,每个模块可以包含一个或多个层次,如数据访问层、服务层、控制层等。
- 混合划分:将上述的任意两种或多种方式结合起来使用,以达到更好的代码复用、可维护性和可扩展性。
现阶段都是常用 混合划分的方式 来 多模块化
三、如何实现多模块划分
前言
本文通过构建一个包含4个子模块的项目,来演示 SpringBoot 在 Maven 环境的多模块构建过程
- common 模块:包含各种通用的工具类、常量定义、异常类等
- web 模块:负责处理 HTTP 请求,将请求转发给 Service 模块处理
- service 模块:负责业务逻辑处理
- dao 模块:负责与数据库进行交互,执行数据访问操作
依赖关系
web模块 依赖 service模块
service模块 依赖 dao模块
dao模块 依赖 common模块
common模块 不需要依赖 谁
1. 创建聚合父工程
1.首先通过 IDEA 工具,使用 Spring Initializr 来快速创建好一个Maven工程,先不用选依赖项。然后删除src文件。
2.然后在 pom.xml 里面声明该父工程包含的子模块。(其它信息就不逐一讲述了,诸如继承SpringBoot官方父工程以及统一依赖管理 请查看下面的注释说明)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 基本信息 -->
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>springboot-module-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-module-demo</name>
<description>Demo project for Spring Boot</description>
<!-- 一般来说父级项目的packaging都需要改为pom,packaging默认类型jar类型-->
<packaging>pom</packaging>
<!-- 配置变量信息-->
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.6.13</spring-boot.version>
</properties>
<!-- 模块说明:这里声明多个子模块 -->
<modules>
<module>web</module>
<module>service</module>
<module>dao</module>
<module>common</module>
</modules>
<!-- 不建议在父模块加具体依赖 -->
<!-- 版本说明:这里统一管理依赖的版本号 -->
<dependencyManagement>
<dependencies>
<!--Spring Boot的依赖项版本管理文档-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--子模块统一版本-->
<dependency>
<groupId>com.example</groupId>
<artifactId>web</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2. 创建子模块(module)
对着父工程右键 - New - Module - > 输入 web
如图:
可以观察到例如web模块的xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 继承本项目的父工程 -->
<parent>
<artifactId>springboot-module-demo</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>web</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
其他的3个模块(service、dao、common)的创建也是以上操作
完成创建后,你可以通过IDEA 的 右侧的 maven工具栏目,可以看到项目的继承关系
3. 编写子模块代码
web 模块的操作
1.调整 web模块的pom.xml
为什么依赖我没有指定版本号,原因是因为父模块的pom.xml的 dependencyManagement 里面的 spring-boot-dependencies 已经帮我确定了版本(在我没有显式的指定版本号时)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 继承父包 -->
<parent>
<artifactId>springboot-module-demo</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>web</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!-- Web模块相关依赖 -->
<dependencies>
<!--web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- MySQL驱动 -->