核心总览
maven 负责依赖管理、项目构建、模块化拆分,spring(boot)负责业务开发,二者结合的架构分为:
- 单模块 spring boot 架构(新手 / 小项目)
- 多模块 单体 spring boot 架构(中大型复杂后台,企业最常用)
- 微服务 spring cloud 架构(超大型分布式系统)
一、单模块 spring boot 架构
1. 结构(maven + spring)
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 应用)
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 服务)
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.命令(同单模块)
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 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,mservice 模块 → 依赖 dao,dao 模块 → 依赖 common,common 模块 → 无业务依赖(公共工具)
dao模块中的pom添加 common依赖

service模块的pom添加 dao依赖

6.配置web模块(启动入口)
添加 web 依赖 + 打包插件
web目录下的pom 增加:
<!-- 核心依赖 -->
<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
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
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
到此这篇关于java maven 结合spring 3 种框架设计架构详解的文章就介绍到这了,更多相关java maven spring内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论