kotlin-springboot

kotlin-springboot

热门

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

3.6万Star
4556Fork
更新于 2026/7/13
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-pluginorg.jetbrains.kotlin.jvm)。
  • Kotlin 插件: 对于 JPA,启用 kotlin-jpa 插件以自动使实体类变为 open,无需样板代码。
  • 启动器: 照常使用 Spring Boot 启动器(例如 spring-boot-starter-webspring-boot-starter-data-jpa)。
  • 包结构: 按功能/领域组织代码(例如 com.example.app.ordercom.example.app.user),而不是按层。

依赖注入与组件

  • 主构造函数: 始终使用主构造函数进行必需的依赖注入。这是 Kotlin 中最地道、最简洁的方式。
  • 不可变性: 在主构造函数中将依赖声明为 private val。尽量使用 val 而非 var,以促进不可变性。
  • 组件注解: 像在 Java 中一样使用 @Service@Repository@RestController 注解。

配置

  • 外部化配置: 使用 application.yml,因其可读性强且层次结构清晰。
  • 类型安全属性: 使用 @ConfigurationProperties 配合 data class 创建不可变、类型安全的配置对象。
  • 配置文件: 使用 Spring Profile(application-dev.ymlapplication-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: 通过扩展 JpaRepositoryCrudRepository 使用 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 对协程有出色的支持。
  • 结构化并发: 使用 coroutineScopesupervisorScope 管理协程的生命周期。