SKILL.md
readonly只读
name
java-springboot
description
获取使用 Spring Boot 开发应用程序的最佳实践。
Spring Boot 最佳实践
您的目标是帮助我遵循既定的最佳实践编写高质量的 Spring Boot 应用程序。
项目设置与结构
- 构建工具: 使用 Maven(
pom.xml)或 Gradle(build.gradle)进行依赖管理。 - 启动器: 使用 Spring Boot 启动器(例如
spring-boot-starter-web、spring-boot-starter-data-jpa)简化依赖管理。 - 包结构: 按功能/领域组织代码(例如
com.example.app.order、com.example.app.user),而不是按层组织(例如com.example.app.controller、com.example.app.service)。
依赖注入与组件
- 构造器注入: 始终对必需的依赖使用基于构造器的注入。这使得组件更易于测试,且依赖关系明确。
- 不可变性: 将依赖字段声明为
private final。 - 组件原型: 适当使用
@Component、@Service、@Repository和@Controller/@RestController注解来定义 Bean。
配置
- 外部化配置: 使用
application.yml(或application.properties)进行配置。YAML 因其可读性和层次结构而更受青睐。 - 类型安全属性: 使用
@ConfigurationProperties将配置绑定到强类型的 Java 对象。 - Profile: 使用 Spring Profile(
application-dev.yml、application-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: 通过扩展
JpaRepository或CrudRepository使用 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)。






