作为一名使用Spring框架多年的开发者,我深知一个合理的项目结构对于团队协作和后期维护的重要性。Spring Boot项目的标准目录结构并非随意设计,而是遵循了"约定优于配置"的理念,同时融合了企业级应用开发的最佳实践。
典型的Spring Boot项目采用Maven或Gradle的标准目录布局,这种结构具有以下优势:
在实际项目中,我通常会根据团队规模和技术栈对基础结构进行适当调整。比如对于微服务项目,会增加api模块存放Feign客户端接口;对于DDD项目,会按照领域模型重新组织包结构。
标准的Java包路径采用反向域名格式:
bash复制com
└── example
└── myspringproject
├── config
├── controller
├── dao
├── dto
├── exception
├── model
├── repository
├── service
└── util
提示:包名应全部小写,避免使用下划线或连字符。公司项目应使用真实的域名反转,如
com.company.product。
config包:
@Configuration注解DataSourceConfig:数据源配置WebMvcConfig:MVC相关配置SecurityConfig:安全配置RedisConfig:缓存配置controller包:
@RestController:REST API@Controller:传统MVC@GetMapping/@PostMapping等@RequestBody/@ResponseBodyservice包:
UserService(接口)UserServiceImpl(实现类)@Transactional注解应加在实现类Spring Boot支持多种配置格式:
application.properties:传统键值对格式application.yml:层次化YAML格式application-{profile}.yml:环境特定配置配置优先级(从高到低):
static目录下的资源会被自动映射:
/static/js/app.js → http://domain/js/app.js/static/css/style.css → http://domain/css/style.css建议子目录结构:
code复制static
├── css
├── js
├── images
└── fonts
templates目录存放视图模板:
.html.ftl.vm模板引擎配置示例:
yaml复制spring:
thymeleaf:
prefix: classpath:/templates/
suffix: .html
cache: false # 开发时关闭缓存
标准测试类命名:
UserServiceTestUserControllerTest测试目录应与main目录保持一致:
code复制src/test/java/com/example/myspringproject/service/UserServiceTest.java
常用注解:
@SpringBootTest:集成测试@WebMvcTest:Controller测试@DataJpaTest:Repository测试@MockBean:模拟依赖src/test/resources存放测试专用配置:
application-test.yml:测试环境配置test-data.sql:测试数据脚本测试配置示例:
yaml复制spring:
datasource:
url: jdbc:h2:mem:testdb
username: sa
password:
jpa:
show-sql: true
hibernate:
ddl-auto: create-drop
核心配置项:
xml复制<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.0</version>
</parent>
<dependencies>
<!-- Web支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 数据访问 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 测试 -->
<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>
等效的Gradle配置:
groovy复制plugins {
id 'org.springframework.boot' version '3.1.0'
id 'io.spring.dependency-management' version '1.1.0'
id 'java'
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
大型项目推荐采用多模块结构:
code复制project-root
├── api (API定义)
├── core (核心业务)
├── web (Web入口)
└── infrastructure (基础设施)
每个子模块都有自己的src目录和构建文件。
领域驱动设计推荐结构:
code复制domain
├── model (领域模型)
├── repository (仓储接口)
└── service (领域服务)
application
├── command (CQRS命令)
├── query (CQRS查询)
└── dto
infrastructure
└── persistence (持久化实现)
微服务项目常见调整:
api模块存放OpenAPI定义client模块存放Feign客户端integration模块存放外部服务集成按功能分包:对于复杂模块,可以按功能而非层级分包
code复制user
├── UserController.java
├── UserService.java
└── UserRepository.java
公共代码处理:
common包存放跨模块共享代码starter模块封装可复用组件文档管理:
/docs目录存放项目文档README.md提供项目概览问题1:循环依赖
问题2:类过多难以管理
问题3:测试代码混乱
Given-When-Then模式,保持测试结构清晰IDE插件:
架构检测工具:
文档生成:
经过多个项目的实践验证,合理的目录结构应该具备以下特点:各层职责清晰、模块划分合理、易于扩展维护、符合团队约定。随着项目演进,结构可能需要调整,但核心分层理念应保持稳定。