Skip to content
清晨的一缕阳光
返回

Spring Boot 项目结构规范

前言

良好的项目结构是代码可维护性的基础。合理的目录组织、包结构、模块划分能让项目更加清晰易维护。本文将介绍 Spring Boot 项目结构的完整规范。

基础项目结构

1. 标准目录结构

demo/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/example/demo/
│   │   │       ├── DemoApplication.java      # 启动类
│   │   │       ├── controller/                # 控制器层
│   │   │       │   ├── UserController.java
│   │   │       │   └── OrderController.java
│   │   │       ├── service/                   # 服务层
│   │   │       │   ├── UserService.java
│   │   │       │   ├── OrderService.java
│   │   │       │   └── impl/                  # 服务实现
│   │   │       │       ├── UserServiceImpl.java
│   │   │       │       └── OrderServiceImpl.java
│   │   │       ├── repository/                # 数据访问层
│   │   │       │   ├── UserRepository.java
│   │   │       │   └── OrderRepository.java
│   │   │       ├── entity/                    # 实体类
│   │   │       │   ├── User.java
│   │   │       │   └── Order.java
│   │   │       ├── dto/                       # 数据传输对象
│   │   │       │   ├── request/               # 请求 DTO
│   │   │       │   │   ├── UserCreateDTO.java
│   │   │       │   │   └── UserUpdateDTO.java
│   │   │       │   └── response/              # 响应 DTO
│   │   │       │       └── UserDTO.java
│   │   │       ├── config/                    # 配置类
│   │   │       │   ├── WebConfig.java
│   │   │       │   └── SecurityConfig.java
│   │   │       ├── common/                    # 公共类
│   │   │       │   ├── exception/             # 异常类
│   │   │       │   │   ├── BusinessException.java
│   │   │       │   │   └── GlobalExceptionHandler.java
│   │   │       │   ├── result/                # 统一响应
│   │   │       │   │   └── R.java
│   │   │       │   └── constants/             # 常量
│   │   │       │       └── Constants.java
│   │   │       └── util/                      # 工具类
│   │   │           ├── DateUtils.java
│   │   │           └── JwtUtils.java
│   │   └── resources/
│   │       ├── application.yml                # 主配置文件
│   │       ├── application-dev.yml            # 开发环境配置
│   │       ├── application-test.yml           # 测试环境配置
│   │       ├── application-prod.yml           # 生产环境配置
│   │       ├── mapper/                        # MyBatis Mapper
│   │       │   └── UserMapper.xml
│   │       ├── templates/                     # 模板文件
│   │       └── static/                        # 静态资源
│   └── test/
│       └── java/
│           └── com/example/demo/
│               ├── DemoApplicationTests.java
│               ├── controller/                # 控制器测试
│               ├── service/                   # 服务测试
│               └── repository/                # 数据访问测试
├── docs/                                      # 文档
│   ├── api/                                   # API 文档
│   └── design/                                # 设计文档
├── scripts/                                   # 脚本
│   ├── deploy.sh                              # 部署脚本
│   └── init.sql                               # 初始化 SQL
├── pom.xml                                    # Maven 配置
├── README.md                                  # 项目说明
└── .gitignore                                 # Git 忽略文件

2. 启动类

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableAsync  // 启用异步
@EnableScheduling  // 启用定时任务
public class DemoApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

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 
         https://maven.apache.org/xsd/maven-4.0.0.xsd">
    
    <modelVersion>4.0.0</modelVersion>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>4.0.0</version>
    </parent>
    
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo Project</description>
    
    <properties>
        <java.version>21</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <dependencies>
        <!-- Spring Boot Starters -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- Database -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        
        <!-- Test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

包结构规范

1. 按功能分层

com.example.demo/
├── controller/          # 控制器层
├── service/             # 服务层
├── repository/          # 数据访问层
├── entity/              # 实体类
├── dto/                 # 数据传输对象
├── config/              # 配置类
├── common/              # 公共类
└── util/                # 工具类

2. 按业务模块划分

com.example.demo/
├── user/                # 用户模块
│   ├── controller/
│   ├── service/
│   ├── repository/
│   ├── entity/
│   └── dto/
├── order/               # 订单模块
│   ├── controller/
│   ├── service/
│   ├── repository/
│   ├── entity/
│   └── dto/
└── product/             # 商品模块
    ├── controller/
    ├── service/
    ├── repository/
    ├── entity/
    └── dto/

3. 混合划分

com.example.demo/
├── controller/          # 统一控制器
├── service/             # 统一服务层
├── repository/          # 统一数据访问层
├── entity/              # 统一实体类
├── dto/                 # 统一 DTO
├── user/                # 用户业务包
│   ├── UserService.java
│   └── UserConverter.java
├── order/               # 订单业务包
│   ├── OrderService.java
│   └── OrderConverter.java
└── config/              # 配置类

模块划分

1. 多模块项目结构

demo-parent/
├── demo-common/         # 公共模块
│   ├── src/
│   │   └── main/
│   │       └── java/
│   │           └── com/example/demo/common/
│   │               ├── result/          # 统一响应
│   │               ├── exception/       # 异常类
│   │               ├── constants/       # 常量
│   │               └── util/            # 工具类
│   └── pom.xml
├── demo-system/         # 系统模块
│   ├── src/
│   │   └── main/
│   │       └── java/
│   │           └── com/example/demo/system/
│   │               ├── user/            # 用户管理
│   │               ├── role/            # 角色管理
│   │               └── menu/            # 菜单管理
│   └── pom.xml
├── demo-business/       # 业务模块
│   ├── src/
│   │   └── main/
│   │       └── java/
│   │           └── com/example/demo/business/
│   │               ├── order/           # 订单
│   │               └── product/         # 商品
│   └── pom.xml
├── demo-admin/          # 管理后台
│   ├── src/
│   │   └── main/
│   │       └── java/
│   │           └── com/example/demo/admin/
│   │               └── controller/
│   └── pom.xml
├── demo-app/            # 应用模块
│   ├── src/
│   │   └── main/
│   │       └── java/
│   │           └── com/example/demo/app/
│   │               └── controller/
│   └── pom.xml
└── pom.xml              # 父 POM

2. 父 POM 配置

<!-- demo-parent/pom.xml -->
<project>
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.example</groupId>
    <artifactId>demo-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    
    <modules>
        <module>demo-common</module>
        <module>demo-system</module>
        <module>demo-business</module>
        <module>demo-admin</module>
        <module>demo-app</module>
    </modules>
    
    <properties>
        <java.version>21</java.version>
        <spring-boot.version>4.0.0</spring-boot.version>
    </properties>
    
    <dependencyManagement>
        <dependencies>
            <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>${project.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

配置文件管理

1. 多环境配置

# application.yml - 主配置
spring:
  profiles:
    active: dev
  application:
    name: demo

server:
  port: 8080

---
# application-dev.yml - 开发环境
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/demo_dev
    username: root
    password: dev_password
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update

logging:
  level:
    com.example.demo: DEBUG

---
# application-prod.yml - 生产环境
spring:
  datasource:
    url: jdbc:mysql://prod-db:3306/demo_prod
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
  jpa:
    show-sql: false
    hibernate:
      ddl-auto: validate

logging:
  level:
    com.example.demo: INFO

2. 配置类组织

package com.example.demo.config;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    // Web 相关配置
}

@Configuration
public class SecurityConfig {
    // 安全相关配置
}

@Configuration
public class RedisConfig {
    // Redis 相关配置
}

@Configuration
public class SwaggerConfig {
    // Swagger 相关配置
}

3. 配置属性类

package com.example.demo.config.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "app.jwt")
public class JwtProperties {
    
    private String secret;
    private long expiration;
    private String issuer;
}

@Data
@Component
@ConfigurationProperties(prefix = "app.upload")
public class UploadProperties {
    
    private String path;
    private long maxSize;
    private List<String> allowedTypes;
}

最佳实践

1. 代码组织原则

✅ 推荐
- 单一职责原则
- 高内聚低耦合
- 依赖倒置原则
- 接口隔离原则

❌ 不推荐
- 大杂烩式组织
- 跨层调用
- 循环依赖

2. 命名一致性

// ✅ 推荐
UserController
UserService
UserServiceImpl
UserRepository
User
UserDTO
UserCreateDTO
UserUpdateDTO

// ❌ 不推荐
UserCtrl
UserSrv
UserDao
UserEntity
UserData

3. 文档组织

docs/
├── api/                    # API 文档
│   ├── user-api.md
│   └── order-api.md
├── design/                 # 设计文档
│   ├── architecture.md
│   └── database-design.md
├── deploy/                 # 部署文档
│   ├── deployment.md
│   └── k8s-config.md
└── changelog/              # 变更日志
    └── CHANGELOG.md

4. README 模板

# Demo Project

## 项目简介

Spring Boot 4 示例项目

## 技术栈

- Spring Boot 4.x
- JDK 21
- MySQL 8.0
- Redis 7.0

## 快速开始

### 环境要求

- JDK 21+
- Maven 3.9+
- MySQL 8.0+

### 运行

```bash
mvn clean install
mvn spring-boot:run

项目结构

src/
├── main/
│   ├── java/
│   └── resources/
└── test/

联系方式


## 总结

项目结构要点:

- ✅ **目录组织** - 标准结构、清晰分层
- ✅ **包结构** - 按功能、按业务模块
- ✅ **模块划分** - 多模块、职责分离
- ✅ **配置管理** - 多环境、配置类
- ✅ **最佳实践** - 组织原则、命名一致性

良好的项目结构是成功的一半。

分享这篇文章到:

上一篇文章
李飞飞01:我看见的世界
下一篇文章
OpenFeign 声明式调用