核心总览
Maven 负责依赖管理、项目构建、模块化拆分 ,Spring(Boot)负责业务开发,二者结合的架构分为:
- 单模块 Spring Boot 架构(新手 / 小项目)
- 多模块 单体 Spring Boot 架构(中大型复杂后台,企业最常用)
- 微服务 Spring Cloud 架构(超大型分布式系统)
一、单模块 Spring Boot 架构
1. 结构(Maven + Spring)
plaintext
spring-boot-demo (1个Maven模块)
├── pom.xml (仅1个配置文件)
└── src
└── 所有代码(controller/service/dao) 都在这
- Maven :单项目、单
pom.xml,仅管理基础依赖 - Spring:单个 Spring Boot 应用,一个启动类,一个打包文件
2. 核心特点
最简单的架构,所有代码放在一个模块里,不分层、不拆分,开箱即用。
3. 优点
✅ 上手极快,零基础可学✅ 开发效率最高,无需配置模块化✅ Maven 打包 / 运行最简单✅ 部署简单(直接运行一个 jar 包)
4. 缺点
❌ 项目变大后代码臃肿、混乱❌ 代码复用性差❌ 不适合多人协作开发❌ 无法拆分业务模块
5. 适用场景
- 学习练习、毕业设计
- 小型后台、简单管理系统
- 快速原型开发
二、多模块 单体 Spring Boot 架构(🔥 企业首选)
1. 结构(Maven 父子工程 + 单 Spring Boot 应用)
plaintext
project-parent (Maven父工程,无代码,仅管理版本)
├── pom.xml
├── common (公共模块:工具类、常量)
├── dao (数据访问模块:Mapper、实体)
├── service (业务模块:Service)
└── web (Web模块:Controller、启动类)
- Maven :父子模块架构 ,父
pom统一管理所有依赖版本,子模块互相依赖 - Spring :依然是一个 Spring Boot 项目(最终打包成一个 jar),只是代码拆分到多个 Maven 模块
2. 核心特点
- 还是单体应用(不拆分服务)
- 仅通过 Maven 拆分代码模块,实现业务解耦、代码复用
- 启动、部署和单模块完全一样
3. 优点
✅ 适合中大型复杂后台系统(你问的复杂系统首选)✅ 代码分层解耦,结构清晰,易维护✅ Maven 统一管理依赖,无版本冲突✅ 代码复用性高(公共模块抽离)✅ 多人协作开发无冲突✅ 部署简单(还是一个 jar 包)
4. 缺点
❌ 比单模块稍复杂,需要学习 Maven 父子工程❌ 本质还是单体,无法独立扩容、独立部署
5. 适用场景
✅ 90% 企业级复杂后台(OA、CRM、电商管理后台、中台系统)✅ 多人团队开发✅ 业务复杂,但不需要分布式
三、微服务 Spring Cloud 架构
1. 结构(Maven 父子工程 + 多个 Spring Boot 服务)
plaintext
cloud-parent (Maven父工程)
├── pom.xml
├── user-service (用户服务:独立SpringBoot)
├── order-service (订单服务:独立SpringBoot)
├── product-service (商品服务:独立SpringBoot)
└── gateway (网关服务)
- Maven:父子工程统一版本,每个服务是独立的 Maven 模块
- Spring :多个独立的 Spring Boot 应用,通过 Spring Cloud 远程调用
2. 核心特点
- 按业务拆分成独立服务
- 每个服务独立开发、独立部署、独立扩容
- 分布式架构
3. 优点
✅ 高并发、高可用、故障隔离(一个服务挂了不影响全局)✅ 支持亿级用户、大型分布式系统✅ 团队并行开发,每个团队负责一个服务✅ 灵活扩容(订单压力大,只扩容订单服务)
4. 缺点
❌ 架构极复杂,学习成本高❌ 运维难度大(需要服务器、中间件)❌ 出现分布式问题(事务、链路追踪)❌ 新手很难上手
5. 适用场景
✅ 超大型互联网项目(淘宝、京东、抖音后台)✅ 高并发、分布式、多团队协作
四、补充:过时架构(原生 Spring + Maven)
结构
无 Spring Boot,纯 Spring + Spring MVC + Maven,手动写 XML 配置
特点
配置繁琐、部署麻烦、开发效率低
现状
企业已完全淘汰,仅用于学习底层原理
五、三种架构 终极对比表
表格
| 架构 | Maven 形态 | Spring 形态 | 优点 | 缺点 | 适用项目 |
|---|---|---|---|---|---|
| 单模块 | 单模块 | 单个 SpringBoot | 最简单、最快 | 代码乱、难维护 | 小项目 / 学习 |
| 多模块单体 | 父子工程 | 单个 SpringBoot | 解耦、易维护、企业标准 | 稍复杂、无法扩容 | 复杂后台(首选) |
| 微服务 | 父子工程 | 多个 SpringBoot | 高可用、分布式 | 极复杂、运维难 | 超大型互联网项目 |
六、创建多模块醒目流程
1.命令(同单模块)
java
mvn archetype:generate -DgroupId=com.mymulti -DartifactId=spring-boot-mymulti -Dversion=1.0.0 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
2.清理父工程(关键)
- 进入文件夹:
cd spring-boot-mymulti - 直接删除
src文件夹 (父工程不需要代码 ,只需要pom.xml)
3.替换pom文件
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">
<modelVersion>4.0.0</modelVersion>
<!-- SpringBoot 父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.15</version>
<relativePath/>
</parent>
<groupId>com.mymulti</groupId>
<artifactId>spring-boot-mymulti</artifactId>
<version>1.0.0</version>
<!-- ✅ 父工程必须是 pom 打包 -->
<packaging>pom</packaging>
<!-- 子模块列表(创建子模块后自动生成) -->
<modules>
</modules>
<properties>
<java.version>1.8</java.version>
</properties>
</project>
4.创建子模块
在 spring-boot-multi 目录下,依次执行:
# common模块
mvn archetype:generate -DgroupId=com.multi -DartifactId=common -Dversion=1.0.0 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
# dao模块
mvn archetype:generate -DgroupId=com.multi -DartifactId=dao -Dversion=1.0.0 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
# service模块
mvn archetype:generate -DgroupId=com.multi -DartifactId=service -Dversion=1.0.0 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
# web模块
mvn archetype:generate -DgroupId=com.multi -DartifactId=web -Dversion=1.0.0 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
5.添加模块间依赖
web 模块 → 依赖 service,m service 模块 → 依赖 dao, dao 模块 → 依赖 common, common 模块 → 无业务依赖(公共工具)
dao模块中的pom添加 common依赖

service模块的pom添加 dao依赖

6.配置web模块(启动入口)
添加 web 依赖 + 打包插件
web目录下的pom 增加:
XML
<!-- 核心依赖 -->
<dependencies>
<!-- 依赖业务层 service -->
<dependency>
<groupId>com.mymulti</groupId>
<artifactId>service</artifactId>
<version>1.0.0</version>
</dependency>
<!-- SpringBoot Web 核心(接口、服务器) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- SpringBoot 打包插件(唯一启动模块需要) -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
编译: mvn clean install -U
启动:mvn spring-boot:run
七.定义路由与访问接口
1. web 模块 → 定义 路由 + 接口(唯一入口)
com.mymulti.controller.UserController
package com.mymulti.controller;
import com.mymulti.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
// 统一路由前缀 /user
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
// 路由:/user/get/1
@GetMapping("/get/{id}")
public Object getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
}
2. service 模块 → 处理业务
package com.mymulti.service;
import com.mymulti.dao.UserMapper;
import com.mymulti.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUserById(Long id) {
return userMapper.selectById(id);
}
}
3. dao 模块 → 操作数据库
package com.mymulti.dao;
import com.mymulti.entity.User;
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
@Select("select * from user where id=#{id}")
User selectById(Long id);
}
4. common 模块 → 公共实体
package com.mymulti.entity;
public class User {
private Long id;
private String username;
// getter/setter
}
八.相关问题
1.模块间在pom里面声明依赖有什么作用
模块间在 pom.xml 声明依赖 = 告诉 Maven:我这个模块,要使用另一个模块的代码!
如果不声明,你根本调用不了其他模块的类,编译直接报错!
举例:
common中定义的类:common/src/main/java/com/mymulti/entity/User.java
java
package com.mymulti.entity;
/**
* 公共实体类(放在 common 模块,所有模块都能用)
* 对应数据库 user 表
*/
public class User {
private Long id;
private String username;
private String password;
// getter/setter
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}
dao中调用
dao/src/main/java/com/mymulti/mapper/UserMapper.java
java
package com.mymulti.mapper;
import com.mymulti.entity.User; // 直接导入 common 模块的类
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* DAO 层:数据库操作
* 直接使用了 common 中的 User 实体类
*/
public interface UserMapper {
// 查询所有用户 → 返回的是 common 里的 User 对象
@Select("select id, username, password from user")
List<User> findAll();
// 根据ID查询用户
@Select("select * from user where id = #{id}")
User findById(Long id);
}
2.除了在web模块定义路由与访问接口 其他模块可以自己定义吗
service / dao / 任意模块,都能写 @RestController、写路由接口,能正常访问。
全局扫描所有模块只要满足 2 个条件,非 web 模块也能写接口:
- 该模块间接 / 直接包含
spring-web依赖(你的项目里都传递进来了) - 类上打
@RestController/@Controller