Kotlin 支持

Kotlin 是一种静态类型语言,面向 JVM(及其他平台),能够编写简洁优雅的代码,并通过 与 Java 编写的现有库互操作

Spring Boot 通过集成 Spring Framework、Spring Data 和 Reactor 等其他 Spring 项目的支持,提供了对 Kotlin 的支持。 更多信息请参见 Spring Framework Kotlin 支持文档

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

要求

Spring Boot 至少需要 Kotlin 1.7.x,并通过依赖管理自动管理合适的 Kotlin 版本。 要使用 Kotlin,类路径中必须包含 org.jetbrains.kotlin:kotlin-stdliborg.jetbrains.kotlin:kotlin-reflectkotlin-stdlibkotlin-stdlib-jdk7kotlin-stdlib-jdk8 变体也可用。

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

Jackson 的 Kotlin 模块 用于在 Kotlin 中序列化/反序列化 JSON 数据。 当类路径中存在时会自动注册。 如果 Jackson 和 Kotlin 都存在但缺少 Jackson Kotlin 模块,会记录警告信息。

如果通过 start.spring.io 启动 Kotlin 项目,这些依赖和插件会默认提供。

空安全

Kotlin 的一大特性是 空安全。 它在编译期处理 null 值,而不是将问题留到运行时并遇到 NullPointerException。 这有助于消除常见的 bug 来源,无需像 Optional 那样引入包装类型的开销。 Kotlin 还允许对可空值使用函数式构造,详见 这份 Kotlin 空安全指南

虽然 Java 的类型系统无法表达空安全,但 Spring Framework、Spring Data 和 Reactor 现在通过工具友好的注解为其 API 提供空安全。 默认情况下,Kotlin 中使用的 Java API 类型会被识别为 平台类型,其空检查较为宽松。 Kotlin 对 JSR 305 注解的支持结合可空性注解,为相关 Spring API 在 Kotlin 中提供空安全。

JSR 305 检查可通过添加 -Xjsr305 编译器参数进行配置,选项包括:-Xjsr305={strict|warn|ignore}。 默认行为等同于 -Xjsr305=warn。 如需让 Kotlin 类型推断自 Spring API 时考虑空安全,需使用 strict,但需注意 Spring API 的空安全声明可能在小版本间变化,未来可能增加更多检查。

泛型类型参数、varargs 及数组元素的可空性尚不支持。 详见 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)
}

扩展

Kotlin 扩展 允许为现有类添加新功能。 Spring Boot Kotlin API 利用这些扩展为现有 API 增加了 Kotlin 专属便捷性。

TestRestTemplate 扩展类似于 Spring Framework 为 RestOperations 提供的扩展。 这些扩展使得可以利用 Kotlin 的 reified 类型参数等特性。

依赖管理

为避免类路径中混用不同版本的 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 启动 Kotlin 项目且包含至少一个响应式依赖,则默认会引入 org.jetbrains.kotlinx:kotlinx-coroutines-reactor 依赖。

@ConfigurationProperties

@ConfigurationProperties 配合 构造器绑定 可支持带不可变 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
	)
}

由于与 Java 互操作的限制,对值类的支持有限。 特别是依赖值类的默认值无法用于配置属性绑定,此时应使用数据类。

如需通过注解处理器生成 自定义元数据,需按 官方文档 配置 kapt 并引入 spring-boot-configuration-processor 依赖。 注意由于 kapt 提供的模型限制,部分特性(如检测默认值或废弃项)无法生效。

测试

虽然可以使用 JUnit 4 测试 Kotlin 代码,但默认推荐使用 JUnit 5。 JUnit 5 允许测试类只实例化一次并复用,适合 Kotlin,可在非静态方法上使用 @BeforeAll@AfterAll 注解。

如需模拟 Kotlin 类,推荐使用 MockK。 如果需要 MockK 版本的 Mockito 特有注解 @MockitoBean@MockitoSpyBean 注解,可使用 SpringMockK,其提供类似的 @MockkBean@SpykBean 注解。

资源

示例