Kotlin Support

Kotlin 是一种针对 JVM(和其他平台)的静态类型语言,它允许编写简洁优雅的代码,同时提供 {url-kotlin-docs}/java-interop.html[与用 Java 编写的现有库的互操作性]。 Spring Boot 通过利用其他 Spring 项目(如 Spring Framework、Spring Data 和 Reactor)中的支持提供 Kotlin 支持。有关详细信息,请参阅 {url-spring-framework-docs}/languages/kotlin.html[Spring Framework Kotlin 支持文档]。 开始使用 Spring Boot 和 Kotlin 的最简单方法是按照 this comprehensive tutorial进行操作。您可以使用 IntelliJ IDEA 创建新的 Kotlin 项目。如果您需要支持,请随时加入 Slack 上的 #spring 频道或在 Stack Overflow 上使用 springkotlin 标记提问。

Requirements

Spring Boot 至少需要 Kotlin 1.7.x,并通过依赖项管理管理一个合适的 Kotlin 版本。要使用 Kotlin,org.jetbrains.kotlin:kotlin-stdliborg.jetbrains.kotlin:kotlin-reflect 必须存在于类路径中。也可以使用 kotlin-stdlib 变体 kotlin-stdlib-jdk7kotlin-stdlib-jdk8

Kotlin classes are final by default 起,您可能希望配置 {url-kotlin-docs}/compiler-plugins.html#spring-support[kotlin-spring] 插件以自动打开带有 Spring 注释的类,这样它们就可以被代理。

Jackson’s Kotlin module是 Kotlin 中序列化/反序列化 JSON 数据所必需的。在类路径中找到时会自动注册它。如果存在 Jackson 和 Kotlin,但不存在 Jackson Kotlin 模块,则会记录一个警告消息。

如果在 start.spring.io上自举 Kotlin 项目,则默认情况下会提供这些依赖项和插件。

Null-safety

Kotlin 的一项主要功能是 {url-kotlin-docs}/null-safety.html[null-safety]。它在编译时处理 null`值,而不是将问题推迟到运行时并遇到 `NullPointerException。这有助于消除常见的漏洞根源,而无需付出像 `Optional`这样的包装的代价。Kotlin 还允许将函数式构造与可空值一起使用,如 comprehensive guide to null-safety in Kotlin所示。

尽管 Java 不允许在类型系统中表达空安全,但 Spring Framework、Spring Data 和 Reactor 现在通过工具友好的注释提供了其 API 的空安全。默认情况下,Kotlin 中使用的 Java API 中的类型被识别为 {url-kotlin-docs}/java-interop.html#null-safety-and-platform-types[平台类型],因此对其放松了空检查。{url-kotlin-docs}/java-interop.html#jsr-305-support[Kotlin 对 JSR 305 注释的支持]与可空性注释相结合,为 Kotlin 中的 Spring API 提供了空安全。

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

泛型类型参数、可变参数和数组元素的可空性尚不受支持。有关最新信息,请参见 SPR-15942。还要注意 Spring Boot 自身的 API {url-github-issues}/10712[尚未注释]。

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 {url-kotlin-docs}/extensions.html[扩展]提供了扩展现有类并添加额外功能的能力。Spring Boot Kotlin API 利用这些扩展向现有 API 添加新的针对 Kotlin 的便利功能。

`TestRestTemplate`扩展与 Spring Framework 为 Spring Framework 中 `RestOperations`提供的扩展类似。除其他外,这些扩展使得利用 Kotlin 具象化类型参数成为可能。

Dependency management

为了避免在类路径上混合不同版本的 Kotlin 依赖项,Spring Boot 导入了 Kotlin BOM。

通过 Maven,可以通过设置 `kotlin.version`属性来自定义 Kotlin 版本,并为 `kotlin-maven-plugin`提供了插件管理。通过 Gradle,Spring Boot 插件会自动将 `kotlin.version`与 Kotlin 插件版本保持一致。

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

如果使用至少一个对 start.spring.io的 reactive 依赖项在 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
	)
}

要使用注释处理器生成 your own metadata,应该使用 spring-boot-configuration-processor`依赖项配置 {url-kotlin-docs}/kapt.html[`kapt]。请注意,某些功能(例如检测默认值或已弃用的项)由于 kapt 提供的模型中的限制而无法正常工作。

Testing

虽然可以使用 JUnit 4 测试 Kotlin 代码,但默认情况下会提供 JUnit 5,并且建议使用它。JUnit 5 支持对测试类进行一次实例化并对该类的所有测试进行重用。这使得可以在非静态方法中使用 `@BeforeAll`和 `@AfterAll`注释,这非常适合 Kotlin。

要模拟 Kotlin 类,建议使用 MockK。如果你需要 Mockito 特定的 @MockBean and @SpyBean annotations的 `MockK`等效项,则可以使用 SpringMockK,它提供了类似的 `@MockkBean`和 `@SpykBean`注释。

Resources

Examples