java-springboot

java-springboot

热门

获取使用 Spring Boot 开发应用程序的最佳实践。

3.6万Star
4464Fork
更新于 2026/7/1
SKILL.md
readonly只读
name
java-springboot
description

获取使用 Spring Boot 开发应用程序的最佳实践。

Spring Boot 最佳实践

您的目标是帮助我遵循既定的最佳实践编写高质量的 Spring Boot 应用程序。

项目设置与结构

  • 构建工具: 使用 Maven(pom.xml)或 Gradle(build.gradle)进行依赖管理。
  • 启动器: 使用 Spring Boot 启动器(例如 spring-boot-starter-webspring-boot-starter-data-jpa)简化依赖管理。
  • 包结构: 按功能/领域组织代码(例如 com.example.app.ordercom.example.app.user),而不是按层组织(例如 com.example.app.controllercom.example.app.service)。

依赖注入与组件

  • 构造器注入: 始终对必需的依赖使用基于构造器的注入。这使得组件更易于测试,且依赖关系明确。
  • 不可变性: 将依赖字段声明为 private final
  • 组件原型: 适当使用 @Component@Service@Repository@Controller/@RestController 注解来定义 Bean。

配置

  • 外部化配置: 使用 application.yml(或 application.properties)进行配置。YAML 因其可读性和层次结构而更受青睐。
  • 类型安全属性: 使用 @ConfigurationProperties 将配置绑定到强类型的 Java 对象。
  • Profile: 使用 Spring Profile(application-dev.ymlapplication-prod.yml)管理特定环境的配置。
  • 机密管理: 不要硬编码机密。使用环境变量或专用的机密管理工具,如 HashiCorp Vault 或 AWS Secrets Manager。

Web 层(控制器)

  • RESTful API: 设计清晰一致的 RESTful 端点。
  • DTO(数据传输对象): 使用 DTO 在 API 层暴露和消费数据。不要直接将 JPA 实体暴露给客户端。
  • 验证: 使用 Java Bean 验证(JSR 380)的注解(@Valid@NotNull@Size)对 DTO 进行请求负载验证。
  • 错误处理: 使用 @ControllerAdvice@ExceptionHandler 实现全局异常处理器,以提供一致的错误响应。

服务层

  • 业务逻辑: 将所有业务逻辑封装在 @Service 类中。
  • 无状态: 服务应该是无状态的。
  • 事务管理: 使用 @Transactional 在服务方法上声明式地管理数据库事务。在必要的最细粒度上应用它。

数据层(仓库)

  • Spring Data JPA: 通过扩展 JpaRepositoryCrudRepository 使用 Spring Data JPA 仓库进行标准数据库操作。
  • 自定义查询: 对于复杂查询,使用 @Query 或 JPA Criteria API。
  • 投影: 使用 DTO 投影仅从数据库获取必要的数据。

日志记录

  • SLF4J: 使用 SLF4J API 进行日志记录。
  • Logger 声明: private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
  • 参数化日志: 使用参数化消息(logger.info("Processing user {}...", userId);)代替字符串拼接以提高性能。

测试

  • 单元测试: 使用 JUnit 5 和 Mockito 等模拟框架为服务和组件编写单元测试。
  • 集成测试: 使用 @SpringBootTest 进行加载 Spring 应用上下文的集成测试。
  • 测试切片: 使用测试切片注解如 @WebMvcTest(用于控制器)或 @DataJpaTest(用于仓库)来隔离测试应用程序的特定部分。
  • Testcontainers: 考虑使用 Testcontainers 进行可靠的集成测试,使用真实的数据库、消息代理等。

安全

  • Spring Security: 使用 Spring Security 进行身份验证和授权。
  • 密码编码: 始终使用强哈希算法(如 BCrypt)对密码进行编码。
  • 输入清理: 通过使用 Spring Data JPA 或参数化查询防止 SQL 注入。通过正确编码输出来防止跨站脚本(XSS)。