1. 模块化概念
模块化
是⼀种结构化
的软件设计⽅法,通过将⼀个软件系统划分为多个相互独⽴
、功能完整且紧密结合的⼦系统
,并通过各个⼦系统间的交互
,来完成整体的⽬ 标。模块化设计
能够使⼀个复杂的系统被
分割成多个易于管理、可维护的⼦系统,⽽且每个⼦系统⼜可以
单独开发、测试、部署、扩展、升级`。- 模块化设计的
基本原则
包括:分⽽治之
:通过划分模块的⽅式,将⼀个复杂系统拆分成多个⼩的、独⽴的、可重复使⽤的单元,每个单元都有明确的功能定位、输⼊输出接⼝、数据格式、资源约束等。可复⽤性
:每个模块都可以独⽴地进⾏开发、调试、测试、部署、扩展、升级。可配置性
:系统中的各个模块之间可以灵活地进⾏组合、编排、嵌套,以实现不同的应⽤场景。透明性
:模块之间的通信接⼝及数据格式应该是开放的,这样可以保证各个模块之间的数据⼀致性和完整性。灵活性
:模块的开发、调试、测试、部署可以由不同的团队或个⼈独⽴完成,并不依赖于整个系统的开发进度和进度发布频率。
2. 创建工程
父工程
- 创建:
spring-boot-example-06-module
父类工程项目 - 添加:
pom.xml
- 结构说明: 主要以 CRM 项目为例,主要分为 2 大服务, 一个
后台管理
和前台系统
。module-api
:【通用接口 API】模块module-manager
: 【后台管理】工程module-website
: 【前台系统】工程

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.13</version>
</parent>
<groupId>com.calvin</groupId>
<artifactId>spring-boot-example-06-module</artifactId>
<version>${module.version}</version>
<!-- 打包方式为 pom -->
<packaging>pom</packaging>
<description>Spring Boot 模块化开发-模拟CMS项目工程</description>
<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>
<hutool.version>5.8.23</hutool.version>
<!-- 项目版本号 -->
<module.version>1.0.0-SNAPSHOT</module.version>
</properties>
<modules>
<!--【通用API】模块 -->
<module>module-api</module>
<!--【后台系统】模块 -->
<module>module-manager</module>
<!--【前台系统】模块 -->
<module>module-website</module>
</modules>
<dependencies>
<!-- START: Web Starter 启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- END: Web Starter 启动器 -->
<!-- START: 单元、接口测试 TEST -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- END: 单元、接口测试 TEST -->
<!-- START: mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.4.1</version>
</dependency>
<!-- mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- END: mybatis-plus -->
<!-- START: devtools 热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- END: devtools 热部署 -->
<!-- START: actuator 监视器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- END: actuator 监视器 -->
<!-- START: hutool 通用工具 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!-- END: hutool 通用工具 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
【通用接口 API】模块
- 新建:
module-api
模块 - 添加:
pom.xml
- 结构说明:
- 该模块用于
提供各服务业务功能API-【注入/调用】
- 新建一些通用的包:
abstract 抽象包
、configuration 配置包
、constant 常量包
等通用的包。
- 该模块用于

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.calvin</groupId>
<artifactId>spring-boot-example-06-module</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>module-api</artifactId>
<description>Spring Boot 模块化开发 => API模块</description>
</project>
java
package com.calvin.module.api;
import com.calvin.module.api.pojo.SysUserRequest;
import com.calvin.module.api.pojo.dto.UserDTO;
/**
* 系统用户-API
*
* @author Calvin
* @date 2024/1/31
* @since v1.0.0
*/
public interface SysUserApi {
/**
* 查询-单个用户信息
*
* @param request 请求
* @return {@link UserDTO}
*/
UserDTO findOne(SysUserRequest request);
}
java
package com.calvin.module.api;
import com.calvin.module.api.pojo.dto.UserDTO;
/**
* 登录-API
*
* @author Calvin
* @date 2024/1/31
* @since v1.0.0
*/
public interface LoginApi {
/**
* 登录
*
* @param username 用户名
* @param password 密码
* @return {@link UserDTO} 通用的用户传输对象
*/
UserDTO login(String username, String password);
}
【后台管理】工程
- 新建:
module-manager
模块 - 添加:
pom.xml
- 结构说明: 主要包含
系统功能-模块
、登录功能-模块
等业务,通过 maven 依赖传递机制(聚合原则) ,最终产生一个启动器-模块
。

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.calvin</groupId>
<artifactId>spring-boot-example-06-module</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>module-manager</artifactId>
<description>Spring Boot 模块化开发 => 【后台管理系统】模块</description>
<packaging>pom</packaging>
<modules>
<module>module-manager-01-sys</module>
<module>module-manager-02-login</module>
<module>module-manager-03-starter</module>
</modules>
<dependencies>
<!-- START: API模块 -->
<dependency>
<groupId>com.calvin</groupId>
<artifactId>module-api</artifactId>
<!-- 保证所有版本同步,所以使用 ${module.version} -->
<version>${module.version}</version>
</dependency>
<!-- END: API模块 -->
</dependencies>
</project>
系统功能-模块
- 新建:
module-manager-01-sys
模块 - 添加:
pom.xml
- 结构说明: 主要使用
MVC模型概念
,进行结构化分包。domain
包: M 模型层(领域驱动模型)mapper
包: P 数据访问层controller
包: C 控制层service
包: S 接口实现层

- 具体实现
通用API模块-系统用户API
, 依赖倒置原则,SysUserService
接口类。
java
package com.calvin.module.manager.sys.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.calvin.module.api.SysUserApi;
import com.calvin.module.manager.sys.domain.entity.SysUser;
import java.util.List;
/**
* 系统用户服务
*
* @author calvin
* @date 2024/01/31
*/
public interface SysUserService extends IService<SysUser>, SysUserApi {
/**
* 按名称搜索
*
* @param name 名字
* @return {@link List}<{@link SysUser}>
*/
List<SysUser> searchByName(String name);
}
SysUserServiceImp
实现类
java
package com.calvin.module.manager.sys.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.calvin.module.api.pojo.SysUserRequest;
import com.calvin.module.api.pojo.dto.UserDTO;
import com.calvin.module.manager.sys.domain.entity.SysUser;
import com.calvin.module.manager.sys.mapper.SysUserMapper;
import com.calvin.module.manager.sys.service.SysUserService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 系统用户服务-实现类
*
* @author calvin
* @date 2024/01/31
*/
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService {
@Override
public List<SysUser> searchByName(String name) {
return this.baseMapper.listByLikeName(name);
}
// -------------------- 公共业务 --------------------
@Override
public UserDTO findOne(SysUserRequest request) {
SysUser sysUser = getById(request.getUserId());
if (sysUser == null) {
return null;
}
UserDTO dto = new UserDTO();
BeanUtils.copyProperties(sysUser, dto);
return dto;
}
}
登录功能-模块
- 新建:
module-manager-02-login
模块 - 添加:
pom.xml
- 结构说明: 主要使用
MVC模型概念
,进行结构化分包。由于没有具体的业务实体,领域相对广泛,所依赖业务较为广泛,耦合度相对较高。controller
包: C 控制层service
包: S 接口实现层

所以,需要 注入/调用通用API模块-系统用户API
, 来实现登录功能。
- 登录功能
- 耦合: 注入/调用
系统用户API
- 耦合: 注入/调用
java
package com.calvin.module.manager.login.service.impl;
import com.calvin.module.api.SysUserApi;
import com.calvin.module.api.pojo.SysUserRequest;
import com.calvin.module.api.pojo.dto.UserDTO;
import com.calvin.module.manager.login.service.LoginService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 登录业务-实现类
*
* @author Calvin
* @date 2024/1/31
* @since v1.0.0
*/
@Service
public class LoginServiceImpl implements LoginService {
@Resource
SysUserApi sysUserApi;
@Override
public UserDTO login(String username, String password) {
SysUserRequest request = new SysUserRequest();
request.setAccount(username);
UserDTO userDTO = sysUserApi.findOne(request);
if (userDTO == null) {
return null;
}
return userDTO;
}
}
启动器-模块
- 新建:
module-manager-03-starter
模块 - 添加:
pom.xml
- 结构说明: 主要使用
MVC模型概念
,进行结构化分包, 该模块通过聚合原则
,整合了上述 2 个模块功能。controller
: C 控制层, 用于首页入口
。ManagerApplication
类: 服务的启动器
。resources
: 服务相关的资源文件
和配置文件
。

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.calvin</groupId>
<artifactId>module-manager</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>module-manager-03-starter</artifactId>
<description>后台管理模块 => 【应用启动器】模块</description>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.calvin</groupId>
<artifactId>module-manager-01-sys</artifactId>
<version>${module.version}</version>
</dependency>
<dependency>
<groupId>com.calvin</groupId>
<artifactId>module-manager-02-login</artifactId>
<version>${module.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.calvin.module.manger.starter.ManagerApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
ManagerApplication
类启动器
java
package com.calvin.module.manger.starter;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 后台管理-应用启动类
*
* @author Calvin
* @date 2024/1/31
* @since v1.0.0
*/
@SpringBootApplication(scanBasePackages = "com.calvin.module")
@MapperScan(value = "com.calvin.module.manager.**.mapper")
public class ManagerApplication {
public static void main(String[] args) {
SpringApplication.run(ManagerApplication.class,args);
}
}
application.yaml
启动器-配置文件
yaml
server:
port: 8081
error:
path: /error
# 数据源配置
spring:
# 配置 MYSQL 连接
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/spring-boot-mybatis-plus?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: cw123789L
# 数据源连接池类型为: hikari
type: com.zaxxer.hikari.HikariDataSource
# hikari 连接池配置
hikari:
# 最大线程池数: 20 个
maximum-pool-size: 20
# 连接超时: 30秒
connection-timeout: 30000
# MyBatis Plus 配置
mybatis-plus:
# 全局配置
global-config:
# db 配置
db-config:
# 逻辑删除字段 (全局配置删除字段名称,不需要使用 @TableLogic)
logic-delete-field: del_flag
# 逻辑删除字段值(默认值为1)
logic-delete-value: Y
# 逻辑未删除字段值(默认值为0)
logic-not-delete-value: N
configuration:
# 控制台日志输出
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 映射的Mapper.xml 文件
mapper-locations: classpath*:/mapper/**/*.xml
# 日志配置
logging:
level:
# mybatis 日志级别为 INFO
mybatis: INFO
【前台系统】工程
- 新建:
module-website
模块 - 添加:
pom.xml
- 结构说明: 主要包含
内容功能-模块
、会员功能-模块
、登录功能-模块
等业务,通过 maven 依赖传递机制(聚合原则) ,最终产生一个启动器-模块
。

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.calvin</groupId>
<artifactId>spring-boot-example-06-module</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>module-website</artifactId>
<description>Spring Boot 模块化开发 =>【前台系统】模块</description>
<packaging>pom</packaging>
<modules>
<module>module-website-01-cms</module>
<module>module-website-02-member</module>
<module>module-website-03-login</module>
<module>module-website-04-starter</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
内容功能-模块
- 新建:
module-website-01-crm
模块 - 添加:
pom.xml
- 结构说明: 主要使用
MVC模型概念
,进行结构化分包。domain
包: M 模型层(领域驱动模型)mapper
包: P 数据访问层controller
包: C 控制层service
包: S 接口实现层
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.calvin</groupId>
<artifactId>module-website</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>module-website-01-cms</artifactId>
<description>前台系统模块 => 【内容管理功能】模块</description>
</project>
会员功能-模块
- 新建:
module-website-02-member
模块 - 添加:
pom.xml
- 结构说明: 主要使用
MVC模型概念
,进行结构化分包。domain
包: M 模型层(领域驱动模型)mapper
包: P 数据访问层controller
包: C 控制层service
包: S 接口实现层
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.calvin</groupId>
<artifactId>module-website</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>module-website-02-member</artifactId>
<description>前台系统模块 => 【会员功能】模块</description>
</project>
登录功能-模块
- 新建:
module-website-03-login
模块 - 添加:
pom.xml
- 结构说明: 主要使用
MVC模型概念
,进行结构化分包。由于没有具体的业务实体,领域相对广泛,所依赖业务较为广泛,耦合度相对较高。controller
包: C 控制层service
包: S 接口实现层

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.calvin</groupId>
<artifactId>module-website</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>module-website-03-login</artifactId>
<description>前台系统模块 => 【登录功能】模块</description>
</project>
启动器-模块
- 新建:
module-website-04-starter
模块 - 添加:
pom.xml
- 结构说明: 主要使用
MVC模型概念
,进行结构化分包, 该模块通过聚合原则
,整合了上述 2 个模块功能。controller
: C 控制层, 用于首页入口
。WebSiteApplication
类: 服务的启动器
。resources
: 服务相关的资源文件
和配置文件
。

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.calvin</groupId>
<artifactId>module-website</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>module-website-04-starter</artifactId>
<description>前台系统模块 => 【应用启动器】模块</description>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.calvin.module.website.starter.WebsiteApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
WebsiteApplication
类启动器
java
package com.calvin.module.website.starter;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 前台-应用启动类
*
* @author Calvin
* @date 2024/1/31
* @since v1.0.0
*/
@SpringBootApplication(scanBasePackages = "com.calvin.module")
@MapperScan(value = "com.calvin.module.website.**.mapper")
public class WebsiteApplication {
public static void main(String[] args) {
SpringApplication.run(WebsiteApplication.class,args);
}
}
application.yaml
启动器-配置文件
yaml
server:
port: 8080
error:
path: /error
# 数据源配置
spring:
# 配置 MYSQL 连接
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/spring-boot-mybatis-plus?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: cw123789L
# 数据源连接池类型为: hikari
type: com.zaxxer.hikari.HikariDataSource
# hikari 连接池配置
hikari:
# 最大线程池数: 20 个
maximum-pool-size: 20
# 连接超时: 30秒
connection-timeout: 30000
# MyBatis Plus 配置
mybatis-plus:
# 全局配置
global-config:
# db 配置
db-config:
# 逻辑删除字段 (全局配置删除字段名称,不需要使用 @TableLogic)
logic-delete-field: del_flag
# 逻辑删除字段值(默认值为1)
logic-delete-value: Y
# 逻辑未删除字段值(默认值为0)
logic-not-delete-value: N
configuration:
# 控制台日志输出
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 映射的Mapper.xml 文件
mapper-locations: classpath*:/mapper/**/*.xml
# 日志配置
logging:
level:
# mybatis 日志级别为 INFO
mybatis: INFO