SKILL.md
readonly只读
name
kotlin-springboot
description
获取使用 Spring Boot 和 Kotlin 开发应用程序的最佳实践。
Spring Boot 与 Kotlin 最佳实践
您的目标是帮助我使用 Kotlin 编写高质量、地道的 Spring Boot 应用程序。
项目设置与结构
- 构建工具: 使用 Maven(
pom.xml)或 Gradle(build.gradle)并添加 Kotlin 插件(kotlin-maven-plugin或org.jetbrains.kotlin.jvm)。 - Kotlin 插件: 对于 JPA,启用
kotlin-jpa插件以自动使实体类变为open,无需样板代码。 - 启动器: 照常使用 Spring Boot 启动器(例如
spring-boot-starter-web、spring-boot-starter-data-jpa)。 - 包结构: 按功能/领域组织代码(例如
com.example.app.order、com.example.app.user),而不是按层。
依赖注入与组件
- 主构造函数: 始终使用主构造函数进行必需的依赖注入。这是 Kotlin 中最地道、最简洁的方式。
- 不可变性: 在主构造函数中将依赖声明为
private val。尽量使用val而非var,以促进不可变性。 - 组件注解: 像在 Java 中一样使用
@Service、@Repository和@RestController注解。
配置
- 外部化配置: 使用
application.yml,因其可读性强且层次结构清晰。 - 类型安全属性: 使用
@ConfigurationProperties配合data class创建不可变、类型安全的配置对象。 - 配置文件: 使用 Spring Profile(
application-dev.yml、application-prod.yml)管理环境特定配置。 - 密钥管理: 切勿硬编码密钥。使用环境变量或专门的密钥管理工具,如 HashiCorp Vault 或 AWS Secrets Manager。
Web 层(控制器)
- RESTful API: 设计清晰一致的 RESTful 端点。
- DTO 的数据类: 对所有 DTO 使用 Kotlin
data class。这免费提供了equals()、hashCode()、toString()和copy(),并促进了不可变性。 - 验证: 在 DTO 数据类上使用 Java Bean 验证(JSR 380)注解(
@Valid、@NotNull、@Size)。 - 错误处理: 使用
@ControllerAdvice和@ExceptionHandler实现全局异常处理器,以提供一致的错误响应。
服务层
- 业务逻辑: 将业务逻辑封装在
@Service类中。 - 无状态: 服务应该是无状态的。
- 事务管理: 在服务方法上使用
@Transactional。在 Kotlin 中,可以应用于类或函数级别。
数据层(仓库)
- JPA 实体: 将实体定义为类。记住它们必须是
open的。强烈建议使用kotlin-jpa编译器插件自动处理此问题。 - 空安全: 利用 Kotlin 的空安全(
?)在类型级别清晰定义哪些实体字段是可选的或必需的。 - Spring Data JPA: 通过扩展
JpaRepository或CrudRepository使用 Spring Data JPA 仓库。 - 协程: 对于响应式应用程序,在数据层利用 Spring Boot 对 Kotlin 协程的支持。
日志记录
- 伴生对象日志器: 声明日志器的地道方式是在伴生对象中。
companion object { private val logger = LoggerFactory.getLogger(MyClass::class.java) } - 参数化日志: 使用参数化消息(
logger.info("Processing user {}...", userId))以提高性能和清晰度。
测试
- JUnit 5: JUnit 5 是默认选项,与 Kotlin 无缝协作。
- 地道测试库: 为了更流畅、更地道的测试,考虑使用 Kotest 进行断言,使用 MockK 进行模拟。它们专为 Kotlin 设计,提供更具表现力的语法。
- 测试切片: 使用测试切片注解如
@WebMvcTest或@DataJpaTest测试应用程序的特定部分。 - Testcontainers: 使用 Testcontainers 进行可靠的集成测试,使用真实的数据库、消息代理等。
协程与异步编程
suspend函数: 对于非阻塞异步代码,在控制器和服务中使用suspend函数。Spring Boot 对协程有出色的支持。- 结构化并发: 使用
coroutineScope或supervisorScope管理协程的生命周期。






