跳到主要内容
版本:3.5.10

Kotlin 支持

QWen Max 中英对照 Kotlin Support

Kotlin 是一门面向 JVM(及其他平台)的静态类型语言,它允许编写简洁而优雅的代码,同时提供与用 Java 编写的现有库的互操作性

Spring Boot 通过利用其他 Spring 项目(如 Spring Framework、Spring Data 和 Reactor)中的 Kotlin 支持来提供 Kotlin 支持。更多信息请参阅 Spring Framework Kotlin 支持文档

开始使用 Spring Boot 和 Kotlin 最简单的方法是按照这篇综合教程进行操作。你可以通过 start.spring.io 创建新的 Kotlin 项目。如果你需要支持,欢迎加入 Kotlin Slack 的 #spring 频道,或在 Stack Overflow 上使用 springkotlin 标签提问。

Requirements

Spring Boot 要求至少使用 Kotlin 1.7.x,并通过依赖管理来管理合适的 Kotlin 版本。要使用 Kotlin,org.jetbrains.kotlin:kotlin-stdliborg.jetbrains.kotlin:kotlin-reflect 必须在 classpath 上。也可以使用 kotlin-stdlib 的变体 kotlin-stdlib-jdk7kotlin-stdlib-jdk8

由于 Kotlin 类默认是 final 的,你很可能需要配置 kotlin-spring 插件,以便自动将带有 Spring 注解的类设为 open,从而可以被代理。

Jackson 的 Kotlin 模块 是在 Kotlin 中序列化 / 反序列化 JSON 数据所必需的。当它在 classpath 中被发现时,会自动注册。

提示

如果在 start.spring.io 上引导一个 Kotlin 项目,这些依赖项和插件会默认提供。

空安全

Kotlin 的一个关键特性是 null 安全。它在编译时处理 null 值,而不是将问题推迟到运行时,从而避免遇到 NullPointerException。这有助于消除一个常见的 bug 来源,而无需付出像 Optional 这样的包装类所带来的开销。Kotlin 还允许对可空值使用函数式构造,如这篇 Kotlin null 安全全面指南 中所述。

尽管 Java 不允许在其类型系统中表达空安全(null-safety),但 Spring Framework、Spring Data 和 Reactor 现在通过与工具友好的注解提供了其 API 的空安全性。默认情况下,Kotlin 中使用的 Java API 类型被视为 平台类型(platform types),对其空检查会有所放宽。Kotlin 对 JSR 305 注解的支持 结合可空性注解,为 Kotlin 中相关的 Spring API 提供了空安全性。

可以通过添加 -Xjsr305 编译器标志并使用以下选项来配置 JSR 305 检查:-Xjsr305={strict|warn|ignore}。默认行为与 -Xjsr305=warn 相同。若要让 Kotlin 从 Spring API 推断出的类型考虑空安全,则需要使用 strict 值,但需注意:Spring API 的可空性声明即使在次要版本之间也可能发生变化,并且未来可能会增加更多的检查)。

注意

泛型类型参数、可变参数(varargs)和数组元素的可空性(nullability)尚不受支持。有关最新信息,请参见 SPR-15942。另外请注意,Spring Boot 自身的 API 尚未添加注解

Kotlin API

runApplication

Spring Boot 提供了一种惯用的方式,通过 runApplication<MyApplication>(*args) 来运行应用程序,如下例所示:

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class MyApplication

fun main(args: Array<String>) {
runApplication<MyApplication>(*args)
}

这是 SpringApplication.run(MyApplication::class.java, *args) 的一个直接替代方案。它还允许对应用程序进行自定义,如下例所示:

runApplication<MyApplication>(*args) {
setBannerMode(OFF)
}

Extensions

Kotlin 扩展 提供了为现有类添加额外功能的能力。Spring Boot Kotlin API 利用这些扩展,为现有 API 添加了新的 Kotlin 特有便利功能。

提供了类似于 Spring Framework 为 RestOperations 提供的 TestRestTemplate 扩展。这些扩展使得可以利用 Kotlin 的具体化类型参数(reified type parameters)等特性。

依赖管理

为了避免在 classpath 中混用不同版本的 Kotlin 依赖,Spring Boot 引入了 Kotlin BOM。

使用 Maven 时,可以通过设置 kotlin.version 属性来自定义 Kotlin 版本,并为 kotlin-maven-plugin 提供插件管理。使用 Gradle 时,Spring Boot 插件会自动将 kotlin.version 与 Kotlin 插件的版本对齐。

Spring Boot 还通过导入 Kotlin Coroutines BOM 来管理 Coroutines 依赖的版本。可以通过设置 kotlin-coroutines.version 属性来自定义该版本。

提示

如果在 start.spring.io 上引导一个 Kotlin 项目,并且至少包含一个响应式依赖项,则默认会提供 org.jetbrains.kotlinx:kotlinx-coroutines-reactor 依赖。

@ConfigurationProperties

@ConfigurationProperties 在与 构造函数绑定(constructor binding) 结合使用时,支持具有不可变 val 属性的数据类,如下例所示:

@ConfigurationProperties("example.kotlin")
data class KotlinExampleProperties(
val name: String,
val description: String,
val myService: MyService) {

data class MyService(
val apiToken: String,
val uri: URI
)
}

由于值类(value classes)与 Java 的互操作性存在限制,对其的支持是有限的。特别是,在配置属性绑定中依赖值类的默认值将无法正常工作。在这种情况下,应改用数据类(data class)。

提示

要使用注解处理器生成 你自己的元数据,应 配置 kapt 并添加 spring-boot-configuration-processor 依赖。请注意,由于 kapt 提供的模型存在一些限制,某些功能(例如检测默认值或已废弃的项)无法正常工作。

测试

虽然可以使用 JUnit 4 来测试 Kotlin 代码,但默认提供并推荐使用 JUnit 5。JUnit 5 允许测试类仅被实例化一次,并在该类的所有测试中复用。这使得可以在非静态方法上使用 @BeforeAll@AfterAll 注解,这与 Kotlin 非常契合。

要模拟 Kotlin 类,推荐使用 MockK。如果你需要与 Mockito 特有的 @MockitoBean 和 @MockitoSpyBean 注解等效的 MockK 注解,可以使用 SpringMockK,它提供了类似的 @MockkBean@SpykBean 注解。

Resources

延伸阅读

示例