java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java maven spring

Java Maven 结合Spring 3 种框架设计架构详解

作者:python开发笔记

文章讲述了Maven和Spring(Boot)结合的三种架构:单模块SpringBoot架构、多模块单体SpringBoot架构和微服务SpringCloud架构,分别介绍了每种架构的特点、优点、缺点和适用场景,最后描述了创建多模块架构的步骤和定义路由与访问接口的方法,感兴趣的朋友跟随小编一起看看吧

核心总览

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

  1. 单模块 Spring Boot 架构(新手 / 小项目)
  2. 多模块 单体 Spring Boot 架构(中大型复杂后台,企业最常用)
  3. 微服务 Spring Cloud 架构(超大型分布式系统)

一、单模块 Spring Boot 架构

1. 结构(Maven + Spring)

spring-boot-demo  (1个Maven模块)
├── pom.xml       (仅1个配置文件)
└── src
    └── 所有代码(controller/service/dao) 都在这

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、启动类)

2. 核心特点

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       (网关服务)

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.清理父工程(关键)

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

  1. 该模块间接 / 直接包含 spring-web 依赖(你的项目里都传递进来了)
  2. 类上打 @RestController / @Controller

到此这篇关于Java Maven 结合Spring 3 种框架设计架构详解的文章就介绍到这了,更多相关java maven spring内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文