spring相关框架及基本目录详解

 更新时间:2026年05月09日 09:15:47   作者:凯qwq  
本文介绍了SpringBoot单体工程、父子工程和微服务工程的接收类和目录结构,以及SpringMVC(Boot整合)工程的核心定位、目录结构和核心配置,建议接收类遵循模块名+操作+ReqDTO的命名规则,并将通用代码抽离为独立模块,合理拆分项目结构,以提高开发和维护效率

一、单体 Spring Boot 工程

单工程、单可执行 Jar 包,所有业务逻辑、配置、依赖都集中在一个工程内,无需模块拆分,开发和部署成本低,适合中小型 CRUD 项目、快速原型开发。

一、接收类的核心存放目录

1. 基础目录结构(单项目)

接收类统一放在根包下的dto目录,且建议再细分req(request,接收类)和resp(response,响应类)子目录,结构如下:

demo-boot-single/          # 项目根目录
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/example/demo/  # 根包(启动类必须在此)
│   │   │       ├── DemoApplication.java  # 唯一启动类(核心入口)
│   │   │       ├── controller/           # 接口层:接收前端请求
│   │   │       │   ├── UserController.java
│   │   │       │   └── OrderController.java
│   │   │       ├── service/              # 业务层接口:定义业务方法
│   │   │       │   ├── UserService.java
│   │   │       │   └── OrderService.java
│   │   │       ├── service/impl/         # 业务层实现:核心业务逻辑
│   │   │       │   ├── UserServiceImpl.java
│   │   │       │   └── OrderServiceImpl.java
│   │   │       ├── mapper/               # 数据访问层:对接数据库
│   │   │       │   ├── UserMapper.java
│   │   │       │   └── OrderMapper.java
│   │   │       ├── entity/               # 实体层:映射数据库表
│   │   │       │   ├── User.java
│   │   │       │   └── Order.java
│   │   │       ├── dto/                  # 数据传输对象:封装入参/出参
│   │   │       │   ├── req/              # 请求DTO:接收前端参数
│   │   │       │   │   ├── UserAddReqDTO.java
│   │   │       │   │   └── OrderQueryReqDTO.java
│   │   │       │   └── resp/             # 响应DTO:返回前端数据
│   │   │       │       ├── UserInfoRespDTO.java
│   │   │       │       └── OrderListRespDTO.java
│   │   │       ├── config/               # 配置层:自定义Bean/框架配置
│   │   │       │   ├── MyBatisConfig.java
│   │   │       │   └── RedisConfig.java
│   │   │       ├── constant/             # 常量层:枚举/固定值
│   │   │       │   ├── CommonConstant.java
│   │   │       │   └── UserStatusEnum.java
│   │   │       ├── exception/            # 异常层:自定义异常+全局处理
│   │   │       │   ├── BusinessException.java
│   │   │       │   └── GlobalExceptionHandler.java
│   │   │       ├── interceptor/          # 拦截器:登录校验/日志
│   │   │       │   └── LoginInterceptor.java
│   │   │       └── util/                 # 工具层:通用辅助方法
│   │   │           ├── DateUtil.java
│   │   │           └── HttpUtil.java
│   │   └── resources/                    # 资源目录
│   │       ├── application.yml           # 核心配置文件(端口/数据库/Redis)
│   │       ├── application-dev.yml       # 开发环境配置
│   │       ├── application-prod.yml      # 生产环境配置
│   │       ├── mapper/                   # MyBatis XML映射文件
│   │       │   ├── UserMapper.xml
│   │       │   └── OrderMapper.xml
│   │       ├── static/                   # 静态资源(CSS/JS/图片,可选)
│   │       ├── templates/                # 视图模板(Thymeleaf,可选)
│   │       └── db/                       # 数据库脚本
│   │           ├── schema.sql            # 建表语句
│   │           └── data.sql              # 初始化数据
│   └── test/                             # 测试目录(和main结构一致)
│       └── java/com/example/demo/
│           ├── controller/
│           │   └── UserControllerTest.java
│           ├── service/
│           │   └── UserServiceTest.java
│           └── DemoApplicationTests.java
├── pom.xml                  # Maven依赖(所有依赖集中在此)
├── README.md                # 项目说明
└── .gitignore               # Git忽略文件

2. 按业务模块细分(复杂单项目)

如果项目业务模块多(如用户、订单、商品),可在req下再按模块拆分,更易维护:

plaintext

dto/
├── req/
│   ├── user/             # 用户模块接收类
│   │   ├── UserAddReqDTO.java
│   │   └── UserLoginReqDTO.java
│   ├── order/            # 订单模块接收类
│   │   ├── OrderCreateReqDTO.java
│   │   └── OrderCancelReqDTO.java
│   └── ai/               # AI模块接收类
│       └── ChatReqDTO.java
└── resp/
    ├── user/
    └── order/

二、接收类的命名规范(必遵循)

接收类的命名要直观体现 “业务 + 操作 + 类型”,让开发者一眼知道用途:

表格

场景

命名规则

示例

新增接口接收类

模块名 + Add + ReqDTO

UserAddReqDTO

、OrderAddReqDTO

修改接口接收类

模块名 + Update + ReqDTO

UserUpdateReqDTO

查询接口接收类

模块名 + Query + ReqDTO

OrderQueryReqDTO

、UserPageReqDTO

登录 / 特殊操作接收类

模块名 + 操作 + ReqDTO

UserLoginReqDTO

、ChatSendReqDTO

三、关键注意事项(避坑)

禁止直接用实体类做接收类

  • 实体类(entity/User.java)是数据库表的映射,包含主键、创建时间等前端无需传递的字段,直接接收会暴露数据库结构,且易引发参数安全问题;
  • 示例:前端仅需传username/password,但实体类有id/createTime,用实体类接收会导致这些字段被前端随意赋值。

简单场景的简化方案

  • 极小项目(仅 1-2 个接口):可临时用@RequestParam单个接收参数,无需创建接收类;
  • 中等项目:至少拆分req/resp,避免接收 / 响应类混放。

接收类的使用示例:在 Controller 中调用接收类,语义清晰:java运行

@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping("/add")
    // 直接接收封装好的接收类
    public Result<?> addUser(@RequestBody UserAddReqDTO userAddReqDTO) {
        userService.addUser(userAddReqDTO);
        return Result.success();
    }
}

特殊接收类的处理

  • 文件上传接收类:可单独放在dto/req/file/下,如FileUploadReqDTO.java
  • 分页通用接收类:可放在dto/req/common/下,如PageReqDTO.java,供所有模块复用。

总结:

  • 核心位置:后端接收类统一放在dto/req/目录下,按业务模块(如user/order)细分;
  • 命名规范:模块名 + 操作 + ReqDTO(如UserAddReqDTO),直观体现用途;
  • 核心原则:接收类和实体类、响应类严格区分,禁止用实体类直接接收前端参数。

二、Spring Boot 父子工程

本质还是单体工程(最终打包为一个 Jar),但在代码层面拆分为 “父工程 + 子模块”,将通用代码(工具、异常、常量)抽离为独立子模块,业务代码保留在另一个子模块,提升代码复用性和维护性,适合中等规模、需要代码分层管理的项目。

一、父子工程整体结构(核心:公共模块独立,业务模块保留)

demo-boot-parent/           # 父工程(仅管理依赖版本,无业务代码)
├── pom.xml                 # 父POM:统一管理所有子模块的依赖版本
├── demo-common/            # 子模块1:通用模块(所有业务复用)
│   ├── pom.xml
│   └── src/main/java/com/example/demo/common/
│       ├── constant/       # 通用常量/枚举
│       │   ├── CommonConstant.java
│       │   └── UserStatusEnum.java
│       ├── exception/      # 通用异常/全局处理器
│       │   ├── BusinessException.java
│       │   └── GlobalExceptionHandler.java
│       ├── interceptor/    # 通用拦截器
│       │   └── LoginInterceptor.java
│       ├── util/           # 通用工具类
│       │   ├── DateUtil.java
│       │   └── HttpUtil.java
│       └── config/         # 通用配置(跨域/Redis)
│           └── RedisConfig.java
└── demo-business/          # 子模块2:业务核心模块(仅此处有启动类)
├── pom.xml             # 依赖demo-common子模块
└── src/
├── main/
│   ├── java/com/example/demo/
│   │   ├── DemoApplication.java  # 唯一启动类
│   │   ├── controller/           # 业务控制器
│   │   │   ├── UserController.java
│   │   │   └── OrderController.java
│   │   ├── service/              # 业务服务接口
│   │   │   ├── UserService.java
│   │   │   └── OrderService.java
│   │   ├── service/impl/         # 业务服务实现
│   │   │   ├── UserServiceImpl.java
│   │   │   └── OrderServiceImpl.java
│   │   ├── mapper/               # 业务数据访问层
│   │   │   ├── UserMapper.java
│   │   │   └── OrderMapper.java
│   │   ├── entity/               # 业务实体
│   │   │   ├── User.java
│   │   │   └── Order.java
│   │   ├── dto/                  # 业务DTO
│   │   │   ├── req/
│   │   │   └── resp/
│   │   └── config/               # 业务专属配置
│   │       └── MyBatisConfig.java
│   └── resources/                # 业务资源
│       ├── application.yml
│       ├── application-dev.yml
│       ├── mapper/
│       │   ├── UserMapper.xml
│       │   └── OrderMapper.xml
│       └── db/
└── test/                         # 业务测试目录
└── java/com/example/demo/
├── controller/
└── service/

二、核心工程职责说明(保证子工程独立)

表格

工程名称

核心职责

独立性说明

demo-springboot-parent

仅作为父工程,无任何业务代码,只在 pom.xml 中统一管理所有子工程的依赖版本(如 Spring Boot、MyBatis、Lombok 等)

纯依赖管理,不依赖任何子工程

demo-common

存放所有公共、通用的代码(常量、异常、工具、通用配置),无业务逻辑

独立编译、可单独发布,被 demo-business 依赖,不依赖任何业务工程

demo-business

存放核心业务代码(控制器、服务、Mapper、实体、DTO)+ 唯一启动类

依赖 demo-common,是最终可运行的工程,包含所有业务逻辑

三、关键配置要点(保证父子工程协同)

1. 父工程 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>
  <!-- 父工程坐标 -->
  <groupId>com.example</groupId>
  <artifactId>demo-springboot-parent</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>
  <name>demo-springboot-parent</name>
  <!-- 子工程声明 -->
  <modules>
    <module>demo-common</module>
    <module>demo-business</module>
  </modules>
  <!-- 统一依赖版本管理 -->
  <properties>
    <spring.boot.version>3.2.0</spring.boot.version>
    <mybatis.version>3.5.15</mybatis.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <!-- 依赖版本锁定 -->
  <dependencyManagement>
    <dependencies>
      <!-- Spring Boot父依赖 -->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring.boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!-- 子工程依赖声明 -->
      <dependency>
        <groupId>com.example</groupId>
        <artifactId>demo-common</artifactId>
        <version>1.0.0</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

2. demo-common 子工程 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">
  <parent>
    <groupId>com.example</groupId>
    <artifactId>demo-springboot-parent</artifactId>
    <version>1.0.0</version>
  </parent>
  <artifactId>demo-common</artifactId>
  <packaging>jar</packaging>
  <name>demo-common</name>
  <!-- 仅引入通用依赖(无业务依赖) -->
  <dependencies>
    <!-- Spring Context(配置/Bean) -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
    </dependency>
    <!-- Redis客户端(通用配置) -->
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
    </dependency>
    <!-- Lombok(工具类简化) -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
  </dependencies>
</project>

3. demo-business 子工程 pom.xml(依赖 demo-common)

<?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">
  <parent>
    <groupId>com.example</groupId>
    <artifactId>demo-springboot-parent</artifactId>
    <version>1.0.0</version>
  </parent>
  <artifactId>demo-business</artifactId>
  <packaging>jar</packaging>
  <name>demo-business</name>
  <!-- 核心依赖:引入公共模块 -->
  <dependencies>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>demo-common</artifactId>
    </dependency>
    <!-- Spring Boot Web(控制器) -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- MyBatis(数据访问) -->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>${mybatis.version}</version>
    </dependency>
    <!-- 数据库驱动 -->
    <dependency>
      <groupId>com.mysql</groupId>
      <artifactId>mysql-connector-j</artifactId>
      <scope>runtime</scope>
    </dependency>
  </dependencies>
  <!-- 启动类配置 -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <mainClass>com.example.demo.DemoApplication</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

四、关键注意事项(保证子工程独立 & 可运行)

  • 包名规范:demo-common 的包名统一为com.example.demo.common,demo-business 引用时需导入该包(如import com.example.demo.common.util.DateUtil);
  • 启动类位置:仅 demo-business 有启动类,且放在com.example.demo根包下,确保能扫描到 demo-common 的 Bean(需在启动类加@ComponentScan(basePackages = "com.example.demo"));
  • 配置隔离:demo-common 仅放通用配置(如 Redis、WebMvc),业务专属配置(如 MyBatis)放在 demo-business;
  • 依赖隔离:demo-common 不引入任何业务依赖(如 MyBatis、数据库驱动),仅保留通用依赖,保证独立性。

总结:

  • 拆分核心:将常量、异常、工具、通用配置抽离为独立的 demo-common 子工程,业务代码 + 启动类保留在 demo-business;
  • 父子关系:父工程仅管理依赖版本,子工程独立(demo-common 可单独复用,demo-business 是唯一可运行工程);
  • 协同规则:demo-business 依赖 demo-common,demo-common 不依赖任何业务模块,保证低耦合、高复用。

三、Spring Cloud 微服务工程

一、微服务整体目录结构(核心:按服务拆分,复用公共模块)

demo-cloud/                 # 微服务父工程(管理Spring Cloud版本)
├── pom.xml                 # 父POM:统一管理Spring Cloud/Spring Boot版本
├── demo-common/            # 公共模块(所有服务复用)
│   ├── pom.xml
│   └── src/main/java/com/example/demo/common/
│       ├── constant/       # 全局常量
│       ├── exception/      # 全局异常
│       ├── util/           # 通用工具
│       ├── dto/            # 通用DTO(分页/统一响应体)
│       └── feign/          # Feign远程调用接口(供服务间调用)
│           └── UserFeignClient.java
├── demo-gateway/           # 网关服务(微服务统一入口)
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/com/example/demo/gateway/
│       │   │   ├── DemoGatewayApplication.java  # 网关启动类
│       │   │   ├── config/                     # 网关配置
│       │   │   │   └── GatewayConfig.java
│       │   │   └── filter/                     # 网关过滤器(鉴权/限流)
│       │   │       └── AuthFilter.java
│       │   └── resources/
│       │       ├── application.yml             # 网关配置(路由规则/Nacos地址)
│       │       └── application-dev.yml
│       └── test/
├── demo-user-service/      # 用户微服务(独立业务)
│   ├── pom.xml             # 依赖demo-common
│   └── src/
│       ├── main/
│       │   ├── java/com/example/demo/user/
│       │   │   ├── DemoUserApplication.java    # 用户服务启动类
│       │   │   ├── controller/                 # 用户接口
│       │   │   │   └── UserController.java
│       │   │   ├── service/                    # 用户业务
│       │   │   │   ├── UserService.java
│       │   │   │   └── impl/UserServiceImpl.java
│       │   │   ├── mapper/                     # 用户数据访问
│       │   │   │   └── UserMapper.java
│       │   │   ├── entity/                     # 用户实体
│       │   │   │   └── User.java
│       │   │   ├── dto/                        # 用户DTO
│       │   │   │   ├── req/
│       │   │   │   └── resp/
│       │   │   └── feign/                      # 对外暴露的Feign接口
│       │   │       └── UserFeignApi.java
│       │   └── resources/
│       │       ├── application.yml             # 用户服务配置(端口/数据库/Nacos)
│       │       ├── application-dev.yml
│       │       └── mapper/
│       │           └── UserMapper.xml
│       └── test/
└── demo-order-service/     # 订单微服务(独立业务)
    ├── pom.xml             # 依赖demo-common + 引入user服务Feign
    └── src/
        ├── main/
        │   ├── java/com/example/demo/order/
        │   │   ├── DemoOrderApplication.java   # 订单服务启动类
        │   │   ├── controller/                 # 订单接口
        │   │   │   └── OrderController.java
        │   │   ├── service/                    # 订单业务(调用user Feign)
        │   │   │   ├── OrderService.java
        │   │   │   └── impl/OrderServiceImpl.java
        │   │   ├── mapper/                     # 订单数据访问
        │   │   │   └── OrderMapper.java
        │   │   ├── entity/                     # 订单实体
        │   │   │   └── Order.java
        │   │   └── dto/                        # 订单DTO
        │   └── resources/
        │       ├── application.yml             # 订单服务配置
        │       └── application-dev.yml
        └── test/

2. 微服务启动类示例(用户服务)

package com.example.demo.user;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
 * 用户微服务启动类
 * @EnableDiscoveryClient:注册到服务注册中心(Nacos/Eureka)
 * @EnableFeignClients:开启Feign远程调用
 * @MapperScan:扫描Mapper接口
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.example.demo.common.feign")
@MapperScan("com.example.demo.user.mapper")
public class DemoUserApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoUserApplication.class, args);
    }
}

二、核心组件职责说明(微服务特有)

组件名称

核心职责

关键特点

demo-common

所有微服务的通用代码,无业务逻辑

独立 Jar 包,被网关、用户、订单等所有服务依赖

demo-gateway

微服务入口,负责路由转发、统一鉴权、跨域、限流

无业务代码,仅处理网关相关逻辑

demo-user-service

专注用户业务(注册、登录、用户信息管理)

独立数据库,对外暴露 Feign 接口供订单服务调用

demo-order-service

专注订单业务(创建订单、查询订单、调用用户服务查用户信息)

依赖用户服务 Feign,独立数据库

demo-ai-service

专注 AI 业务(对话、向量检索)

无数据库依赖,仅对接 AI 模型

三、单个微服务内部分层(以用户服务为例)

每个微服务内部仍遵循 Spring Boot 单项目的分层规范,保证自身完整性:

demo-user-service/src/main/java/com/example/demo/user/
├── DemoUserApplication.java      # 微服务启动类(加@SpringBootApplication、@EnableDiscoveryClient)
├── controller/UserController.java # 用户接口(仅处理用户相关请求)
├── service/
│   ├── UserService.java          # 用户服务接口
│   └── impl/UserServiceImpl.java # 用户服务实现
├── mapper/UserMapper.java        # 用户Mapper(对接user表)
├── entity/User.java              # 用户实体(仅映射user表)
├── dto/
│   ├── req/UserAddReqDTO.java    # 用户新增入参
│   └── resp/UserInfoRespDTO.java # 用户信息出参
├── config/MyBatisConfig.java     # 用户服务专属MyBatis配置
└── feign/UserFeignClient.java    # 对外暴露的Feign接口(供订单服务调用)

四、微服务核心配置要点

一、微服务整体目录结构(核心:按服务拆分,复用公共模块)

demo-microservice/                # 微服务父工程(仅管理依赖版本)
├── pom.xml                       # 父POM:统一管理Spring Cloud、各依赖版本
├── demo-common/                  # 公共通用模块(所有微服务复用)
│   ├── pom.xml
│   └── src/main/java/com/example/demo/common/
│       ├── constant/             # 全局常量(如状态码、通用枚举)
│       ├── exception/            # 全局异常(业务异常、全局处理器)
│       ├── util/                 # 通用工具(日期、HTTP、Bean拷贝)
│       ├── config/               # 通用配置(Redis、跨域、Feign配置)
│       ├── dto/                  # 通用DTO(分页、统一响应体)
│       └── feign/                # Feign远程调用接口(给其他服务调用)
├── demo-gateway/                 # 网关微服务(统一入口、路由、鉴权)
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/com/example/demo/gateway/
│       │   │   ├── DemoGatewayApplication.java # 网关启动类
│       │   │   ├── config/       # 网关配置(路由、跨域、过滤器)
│       │   │   ├── filter/       # 网关过滤器(token校验、日志)
│       │   │   └── handler/      # 网关异常处理
│       │   └── resources/
│       │       ├── application.yml
│       │       └── application-dev.yml
│       └── test/
├── demo-user-service/            # 用户微服务(用户相关业务)
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/com/example/demo/user/
│       │   │   ├── DemoUserApplication.java # 用户服务启动类
│       │   │   ├── controller/   # 用户控制器(仅用户接口)
│       │   │   ├── service/      # 用户服务层(接口+实现)
│       │   │   ├── mapper/       # 用户数据访问层
│       │   │   ├── entity/       # 用户实体(仅用户相关表)
│       │   │   ├── dto/          # 用户DTO(入参/出参)
│       │   │   ├── config/       # 用户服务专属配置(MyBatis、MQ)
│       │   │   └── feign/        # 对外暴露的Feign接口(供其他服务调用)
│       │   └── resources/
│       │       ├── application.yml
│       │       ├── application-dev.yml
│       │       └── mapper/       # 用户Mapper.xml
│       └── test/
├── demo-order-service/           # 订单微服务(订单相关业务)
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/com/example/demo/order/
│       │   │   ├── DemoOrderApplication.java # 订单服务启动类
│       │   │   ├── controller/   # 订单控制器
│       │   │   ├── service/      # 订单服务层(含调用用户服务Feign)
│       │   │   ├── mapper/       # 订单数据访问层
│       │   │   ├── entity/       # 订单实体
│       │   │   ├── dto/          # 订单DTO
│       │   │   └── config/       # 订单服务专属配置
│       │   └── resources/
│       │       ├── application.yml
│       │       ├── application-dev.yml
│       │       └── mapper/       # 订单Mapper.xml
│       └── test/
├── demo-ai-service/              # AI微服务(可选,AI相关业务)
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/com/example/demo/ai/
│       │   │   ├── DemoAiApplication.java # AI服务启动类
│       │   │   ├── controller/   # AI控制器
│       │   │   ├── service/      # AI服务层
│       │   │   ├── model/        # AI模型相关DTO
│       │   │   └── config/       # AI配置(OpenAI密钥、模型参数)
│       │   └── resources/
│       │       ├── application.yml
│       │       ├── application-dev.yml
│       │       └── ai_prompt/    # AI提示词模板
│       └── test/
├── README.md                     # 微服务整体说明
└── .gitignore                    # 全局忽略文件

二、核心组件职责说明(微服务特有)

组件名称

核心职责

关键特点

demo-common

所有微服务的通用代码,无业务逻辑

独立 Jar 包,被网关、用户、订单等所有服务依赖

demo-gateway

微服务入口,负责路由转发、统一鉴权、跨域、限流

无业务代码,仅处理网关相关逻辑

demo-user-service

专注用户业务(注册、登录、用户信息管理)

独立数据库,对外暴露 Feign 接口供订单服务调用

demo-order-service

专注订单业务(创建订单、查询订单、调用用户服务查用户信息)

依赖用户服务 Feign,独立数据库

demo-ai-service

专注 AI 业务(对话、向量检索)

无数据库依赖,仅对接 AI 模型

三、单个微服务内部分层(以用户服务为例)

微服务整体目录结构(核心:按服务拆分,复用公共模块)

demo-microservice/                # 微服务父工程(仅管理依赖版本)
├── pom.xml                       # 父POM:统一管理Spring Cloud、各依赖版本
├── demo-common/                  # 公共通用模块(所有微服务复用)
│   ├── pom.xml
│   └── src/main/java/com/example/demo/common/
│       ├── constant/             # 全局常量(如状态码、通用枚举)
│       ├── exception/            # 全局异常(业务异常、全局处理器)
│       ├── util/                 # 通用工具(日期、HTTP、Bean拷贝)
│       ├── config/               # 通用配置(Redis、跨域、Feign配置)
│       ├── dto/                  # 通用DTO(分页、统一响应体)
│       └── feign/                # Feign远程调用接口(给其他服务调用)
├── demo-gateway/                 # 网关微服务(统一入口、路由、鉴权)
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/com/example/demo/gateway/
│       │   │   ├── DemoGatewayApplication.java # 网关启动类
│       │   │   ├── config/       # 网关配置(路由、跨域、过滤器)
│       │   │   ├── filter/       # 网关过滤器(token校验、日志)
│       │   │   └── handler/      # 网关异常处理
│       │   └── resources/
│       │       ├── application.yml
│       │       └── application-dev.yml
│       └── test/
├── demo-user-service/            # 用户微服务(用户相关业务)
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/com/example/demo/user/
│       │   │   ├── DemoUserApplication.java # 用户服务启动类
│       │   │   ├── controller/   # 用户控制器(仅用户接口)
│       │   │   ├── service/      # 用户服务层(接口+实现)
│       │   │   ├── mapper/       # 用户数据访问层
│       │   │   ├── entity/       # 用户实体(仅用户相关表)
│       │   │   ├── dto/          # 用户DTO(入参/出参)
│       │   │   ├── config/       # 用户服务专属配置(MyBatis、MQ)
│       │   │   └── feign/        # 对外暴露的Feign接口(供其他服务调用)
│       │   └── resources/
│       │       ├── application.yml
│       │       ├── application-dev.yml
│       │       └── mapper/       # 用户Mapper.xml
│       └── test/
├── demo-order-service/           # 订单微服务(订单相关业务)
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/com/example/demo/order/
│       │   │   ├── DemoOrderApplication.java # 订单服务启动类
│       │   │   ├── controller/   # 订单控制器
│       │   │   ├── service/      # 订单服务层(含调用用户服务Feign)
│       │   │   ├── mapper/       # 订单数据访问层
│       │   │   ├── entity/       # 订单实体
│       │   │   ├── dto/          # 订单DTO
│       │   │   └── config/       # 订单服务专属配置
│       │   └── resources/
│       │       ├── application.yml
│       │       ├── application-dev.yml
│       │       └── mapper/       # 订单Mapper.xml
│       └── test/
├── demo-ai-service/              # AI微服务(可选,AI相关业务)
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/com/example/demo/ai/
│       │   │   ├── DemoAiApplication.java # AI服务启动类
│       │   │   ├── controller/   # AI控制器
│       │   │   ├── service/      # AI服务层
│       │   │   ├── model/        # AI模型相关DTO
│       │   │   └── config/       # AI配置(OpenAI密钥、模型参数)
│       │   └── resources/
│       │       ├── application.yml
│       │       ├── application-dev.yml
│       │       └── ai_prompt/    # AI提示词模板
│       └── test/
├── README.md                     # 微服务整体说明
└── .gitignore                    # 全局忽略文件

二、核心组件职责说明(微服务特有)

组件名称

核心职责

关键特点

demo-common

所有微服务的通用代码,无业务逻辑

独立 Jar 包,被网关、用户、订单等所有服务依赖

demo-gateway

微服务入口,负责路由转发、统一鉴权、跨域、限流

无业务代码,仅处理网关相关逻辑

demo-user-service

专注用户业务(注册、登录、用户信息管理)

独立数据库,对外暴露 Feign 接口供订单服务调用

demo-order-service

专注订单业务(创建订单、查询订单、调用用户服务查用户信息)

依赖用户服务 Feign,独立数据库

demo-ai-service

专注 AI 业务(对话、向量检索)

无数据库依赖,仅对接 AI 模型

三、单个微服务内部分层(以用户服务为例)

每个微服务内部仍遵循 Spring Boot 单项目的分层规范,保证自身完整性:

demo-user-service/src/main/java/com/example/demo/user/
├── DemoUserApplication.java      # 微服务启动类(加@SpringBootApplication、@EnableDiscoveryClient)
├── controller/UserController.java # 用户接口(仅处理用户相关请求)
├── service/
│   ├── UserService.java          # 用户服务接口
│   └── impl/UserServiceImpl.java # 用户服务实现
├── mapper/UserMapper.java        # 用户Mapper(对接user表)
├── entity/User.java              # 用户实体(仅映射user表)
├── dto/
│   ├── req/UserAddReqDTO.java    # 用户新增入参
│   └── resp/UserInfoRespDTO.java # 用户信息出参
├── config/MyBatisConfig.java     # 用户服务专属MyBatis配置
└── feign/UserFeignClient.java    # 对外暴露的Feign接口(供订单服务调用)

1. 父工程 pom.xml(核心:管理 Spring Cloud 版本)

<?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>
  <groupId>com.example</groupId>
  <artifactId>demo-microservice</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>
  <name>demo-microservice</name>
  <!-- 子模块声明 -->
  <modules>
    <module>demo-common</module>
    <module>demo-gateway</module>
    <module>demo-user-service</module>
    <module>demo-order-service</module>
    <module>demo-ai-service</module>
  </modules>
  <!-- 版本管理:Spring Cloud & Spring Boot -->
  <properties>
    <spring.boot.version>3.2.0</spring.boot.version>
    <spring.cloud.version>2023.0.0</spring.cloud.version>
    <spring.cloud.alibaba.version>2023.0.1.0</spring.cloud.alibaba.version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <!-- Spring Boot 依赖 -->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring.boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!-- Spring Cloud 依赖 -->
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring.cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!-- Spring Cloud Alibaba 依赖(可选) -->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>${spring.cloud.alibaba.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!-- 公共模块依赖 -->
      <dependency>
        <groupId>com.example</groupId>
        <artifactId>demo-common</artifactId>
        <version>1.0.0</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

2. 微服务启动类示例(用户服务)

package com.example.demo.user;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
 * 用户微服务启动类
 * @EnableDiscoveryClient:注册到服务注册中心(Nacos/Eureka)
 * @EnableFeignClients:开启Feign远程调用
 * @MapperScan:扫描Mapper接口
 */
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.example.demo.common.feign")
@MapperScan("com.example.demo.user.mapper")
public class DemoUserApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoUserApplication.class, args);
    }
}

五、微服务目录设计核心原则

  • 服务独立:每个微服务是独立的子工程,有自己的启动类、配置、数据库(按需),可独立部署、扩容;
  • 复用优先:通用代码(工具、异常、常量)全部放到 demo-common,避免重复编写;
  • 边界清晰:每个微服务仅负责自身业务(如用户服务只处理用户,订单服务只处理订单),通过 Feign 调用其他服务;
  • 分层统一:每个微服务内部仍遵循 “Controller→Service→Mapper→Entity” 分层,保持开发规范一致。

总结:

  • 整体结构:微服务以父工程为依赖入口,拆分为公共模块、网关、各业务微服务,每个微服务独立且复用公共代码;
  • 内部规范:单个微服务内部保留 Spring Boot 经典分层,保证业务逻辑清晰;
  • 核心特点:服务解耦、独立部署、通用代码复用,符合微服务 “高内聚、低耦合” 的设计思想。

四、Spring MVC(Boot 整合)工程

1. 核心定位

基于 Spring Boot 整合 Spring MVC 框架,严格贴合 MVC(Model-View-Controller)分层设计,支持前后端一体(返回视图)或前后端分离(返回 JSON),是 Web 开发的基础架构,适配所有 Web 项目。

2. 完整目录结构

demo-mvc/                   # Spring Boot + MVC工程
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/example/demo/
│   │   │       ├── DemoApplication.java  # 启动类
│   │   │       ├── controller/           # C层(Controller):接收请求
│   │   │       │   ├── UserController.java  # @Controller返回视图 / @RestController返回JSON
│   │   │       │   └── OrderController.java
│   │   │       ├── service/              # M层(Model):业务逻辑
│   │   │       │   ├── UserService.java
│   │   │       │   └── impl/UserServiceImpl.java
│   │   │       ├── mapper/               # M层(Model):数据访问
│   │   │       │   └── UserMapper.java
│   │   │       ├── entity/               # M层(Model):数据模型
│   │   │       │   └── User.java
│   │   │       ├── dto/                  # M层扩展:传输模型
│   │   │       │   ├── req/
│   │   │       │   └── resp/
│   │   │       └── config/               # MVC配置
│   │   │           └── WebMvcConfig.java # 自定义MVC规则(视图解析器/静态资源)
│   │   └── resources/                    # 资源目录
│   │       ├── application.yml           # MVC核心配置(端口/视图解析器)
│   │       ├── static/                   # 静态资源(CSS/JS/图片)
│   │       │   ├── css/
│   │       │   │   └── index.css
│   │       │   └── js/
│   │       │       └── index.js
│   │       └── templates/                # V层(View):视图模板(Thymeleaf)
│   │           ├── user/
│   │           │   └── userInfo.html
│   │           └── index.html
│   └── test/
│       └── java/com/example/demo/
│           └── controller/
│               └── UserControllerTest.java
├── pom.xml                  # 核心依赖:spring-boot-starter-web(内置Spring MVC)
├── README.md
└── .gitignore

MVC 分层与目录的对应关系(核心)

表格

MVC 分层

对应目录 / 类

核心作用

Controller(C 层)

controller/

接收前端请求,调用 Service,返回视图 / JSON(Spring Boot 中 @RestController 返回 JSON,@Controller 返回视图)

Model(M 层)

entity/

/dto/

/service/

数据模型(实体)+ 业务逻辑(Service)+ 数据访问(Mapper),是 MVC 的核心数据层

View(V 层)

resources/templates/

前端视图页面(Thymeleaf/Freemarker),前后端分离项目中此目录可空

3. 核心配置(WebMvcConfig.java)

package com.example.demo.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
 * Spring MVC自定义配置(替代传统XML)
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    // 配置视图解析器(前后端一体场景)
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.thymeleaf()
                .prefix("classpath:/templates/")  // 视图前缀
                .suffix(".html");                 // 视图后缀
    }
    // 配置静态资源访问(放行static目录)
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/");
    }
}

4. 核心特点

  • 严格贴合 MVC 分层:C 层 = controller 目录,M 层 = service/mapper/entity,V 层 = templates 目录;
  • 核心依赖是spring-boot-starter-web(内置 Spring MVC 核心组件 DispatcherServlet);
  • 前后端一体场景:Controller 用@Controller,返回视图名称(如return "user/userInfo");
  • 前后端分离场景:Controller 用@RestController,返回 JSON,可删除 templates 目录;
  • 通过WebMvcConfig自定义 MVC 规则(视图解析器、静态资源、拦截器),替代传统 XML 配置。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用Java和PostgreSQL存储向量数据的实现指南

    使用Java和PostgreSQL存储向量数据的实现指南

    在当今的数字化时代,数据存储的方式和技术正变得越来越复杂和多样化,随着机器学习和数据科学的发展,向量数据的存储和管理变得尤为重要,本文将详细介绍如何使用 Java 和 PostgreSQL 数据库来存储向量数据,需要的朋友可以参考下
    2024-09-09
  • Maven编译遇到Process terminated问题(四种情况全部解决)

    Maven编译遇到Process terminated问题(四种情况全部解决)

    这篇文章主要介绍了Maven编译遇到Process terminated问题(四种情况全部解决),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Netty进阶之EventExecutorGroup源码详解

    Netty进阶之EventExecutorGroup源码详解

    这篇文章主要介绍了Netty进阶之EventExecutorGroup源码详解,EventExecutorGroup继承了JDK的ScheduledExecutroService,那么它就拥有了执行定时任务,执行提交的普通任务,需要的朋友可以参考下
    2023-11-11
  • 分享几个写简洁java代码的小技巧

    分享几个写简洁java代码的小技巧

    成为一个优秀的Java程序员,有着良好的代码编写习惯是必不可少的,下面这篇文章主要给大家介绍了关于写java代码的小技巧,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • InteliJ IDEA 设置eclipse快捷键 的图文教程

    InteliJ IDEA 设置eclipse快捷键 的图文教程

    本文通过图文并茂的形式给大家介绍了InteliJ IDEA 设置eclipse快捷键 ,非常不错,具有一定的参考借鉴价值,需要的朋友参考下
    2018-06-06
  • JavaWeb dbutils执行sql命令并遍历结果集时不能查到内容的原因分析

    JavaWeb dbutils执行sql命令并遍历结果集时不能查到内容的原因分析

    这篇文章主要介绍了JavaWeb dbutils执行sql命令并遍历结果集时不能查到内容的原因分析及简单处理方法,文中给大家介绍了javaweb中dbutils的使用,需要的朋友可以参考下
    2017-12-12
  • Java 枚举的基本使用方法及实际使用场景

    Java 枚举的基本使用方法及实际使用场景

    枚举是 Java 中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Java 枚举的用法及实际使用场景,感兴趣的朋友一起看看吧
    2025-06-06
  • java基于poi导出excel透视表代码实例

    java基于poi导出excel透视表代码实例

    这篇文章主要介绍了java基于poi导出excel透视表代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 关于@ConfigurationProperties注解全解析

    关于@ConfigurationProperties注解全解析

    通过@ConfigurationProperties和@ConditionalOnProperty注解,可以实现基于配置的条件加载Bean,以此优化Spring Boot应用的启动速度,在application.yml中设置配置项,如是否加载特定的Bean(以swagger配置为例)
    2024-11-11
  • Mybatis中xml的动态sql实现示例

    Mybatis中xml的动态sql实现示例

    本文主要介绍了Mybatis中xml的动态sql实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论