Java(4) maven 结合spring 3 种框架设计架构

核心总览

Maven 负责依赖管理、项目构建、模块化拆分 ,Spring(Boot)负责业务开发,二者结合的架构分为:

  1. 单模块 Spring Boot 架构(新手 / 小项目)
  2. 多模块 单体 Spring Boot 架构(中大型复杂后台,企业最常用)
  3. 微服务 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.清理父工程(关键)

  1. 进入文件夹:cd spring-boot-mymulti
  2. 直接删除 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 模块也能写接口:

  1. 该模块间接 / 直接包含 spring-web 依赖(你的项目里都传递进来了)
  2. 类上打 @RestController / @Controller
相关推荐
MY_TEUCK2 小时前
【Maven基础】Maven从安装配置到依赖管理与生命周期(可复现+避坑+面试)
java·面试·maven
huipeng9262 小时前
分布式服务部署详解
java·开发语言·spring cloud·微服务
秦歌6662 小时前
RAG-6-高级RAG实战案例:自适应路由 + 自评估重写 + 网络回退
java·服务器·前端·人工智能·python
极客先躯3 小时前
高级java每日一道面试题-2025年11月17日-容器与虚拟化题[Dockerj]-请解释容器和虚拟机的本质区别,从架构层面详细说明。
java·docker·架构
雨奔10 小时前
Kubernetes DNS 完全指南:服务发现核心机制与实践
java·kubernetes·服务发现
逻辑驱动的ken10 小时前
Java高频面试考点场景题14
java·开发语言·深度学习·面试·职场和发展·求职招聘·春招
阿冰冰呀10 小时前
互联网大厂Java求职面试实录:谢飞机的“水货”之路
java·mybatis·dubbo·springboot·线程池·多线程·hashmap
水无痕simon10 小时前
1.单机部署Nacos1.3.2
java
Java小生不才13 小时前
spring AI文生图
java·人工智能·spring ai