当前位置: 代码网 > it编程>编程语言>Java > spring相关框架及基本目录详解

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

2026年05月09日 Java 我要评论
一、单体 spring boot 工程单工程、单可执行 jar 包,所有业务逻辑、配置、依赖都集中在一个工程内,无需模块拆分,开发和部署成本低,适合中小型 crud 项目、快速原型开发。一、接收类的核

一、单体 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 配置。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com