Kotlin 支持

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

Spring Boot 通过利用其他 Spring 项目(如 Spring Framework、Spring Data 和 Reactor)的支持来提供 Kotlin 支持。 See the Spring Framework Kotlin support documentation for more information.spring-doc.cadn.net.cn

The easiest way to start with Spring Boot and Kotlin is to follow 这个全面的教程。 You can create new Kotlin projects by using start.spring.io。 Feel free to join the #spring channel of Kotlin Slack or ask a question with the spring and kotlin tags on Stack Overflow if you need support.spring-doc.cadn.net.cn

要求

Spring Boot 至少需要 Kotlin 2.2.x,并通过依赖管理来管理合适的 Kotlin 版本。 要使用 Kotlin,类路径中必须包含 org.jetbrains.kotlin:kotlin-stdliborg.jetbrains.kotlin:kotlin-reflectspring-doc.cadn.net.cn

Kotlin 2.2.x 引入了新的注解传播默认规则,用于将注解传播到参数、字段和属性。为避免相关警告,并使用在即将发布的版本中很可能成为 Kotlin 默认行为的设置,建议配置编译器标志 -Xannotation-default-target=param-propertyspring-doc.cadn.net.cn

由于Kotlin 类默认是 final 的,你很可能需要配置kotlin-spring插件,以便自动将带有 Spring 注解的类打开(open),使其能够被代理。spring-doc.cadn.net.cn

Jackson 的 Kotlin 模块 是在 Kotlin 中序列化/反序列化 JSON 数据所必需的。 当它在类路径中被发现时,会自动注册。spring-doc.cadn.net.cn

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

Null-safety

Kotlin 的关键特性之一是空安全。 它在编译时处理null值,而不是将问题推迟到运行时并遇到NullPointerException。 这有助于消除一个常见的错误来源,而无需付出像Optional这样的包装器的代价。 Kotlin 还允许对可空值使用函数式构造,如本Kotlin 空安全综合指南中所述。spring-doc.cadn.net.cn

尽管 Java 无法在其类型系统中表达空值安全性,但大多数 Spring 项目通过 JSpecify 注解提供空值安全性spring-doc.cadn.net.cn

从 Kotlin 2.1 起,Kotlin 开始强制严格处理来自 org.jspecify.annotations 包的可空性注解。spring-doc.cadn.net.cn

Kotlin API

运行应用程序

Spring Boot 提供了一种 idiomatic 的方式来运行一个应用,如以下示例所示: runApplication<MyApplication>(*args)spring-doc.cadn.net.cn

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)的一个即插即用替代方案。 它还允许如以下示例所示自定义应用程序:spring-doc.cadn.net.cn

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

扩展

Kotlin extensions 提供了扩展现有类以添加额外功能的能力。 The Spring Boot Kotlin API 利用这些扩展来为现有的 API 添加新的 Kotlin 特定便利功能。spring-doc.cadn.net.cn

TestRestTemplate 扩展,类似于 Spring Framework 为 RestOperations 在 Spring Framework 中提供的扩展,现已提供。 除其他功能外,这些扩展使得利用 Kotlin 的实化类型参数成为可能。spring-doc.cadn.net.cn

依赖管理

为了避免类路径上混入不同版本的Kotlin依赖项,Spring Boot导入了Kotlin BOM。spring-doc.cadn.net.cn

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

Spring Boot 也通过导入Kotlin Coroutines BOM 来管理Coroutines 的版本。 该版本可以通过设置kotlin-coroutines.version属性来自定义。spring-doc.cadn.net.cn

org.jetbrains.kotlinx:kotlinx-coroutines-reactor 依赖项会在使用 start.spring.io 初始化包含至少一个响应式依赖的 Kotlin 项目时默认提供。

@ConfigurationProperties

@ConfigurationProperties构造函数绑定 结合使用时,支持具有不可变 val 属性的数据类,如下例所示:spring-doc.cadn.net.cn

@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的互操作性有限,因此对其支持是有限的。 特别是,依赖于值类的默认值将无法与配置属性绑定工作。 在这种情况下,应使用数据类代替。spring-doc.cadn.net.cn

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

测试

虽然可以使用 JUnit 4 测试 Kotlin 代码,但默认提供并推荐使用 JUnit 5。 JUnit 5 允许测试类只实例化一次,并复用于该类的所有测试。 这使得可以在非静态方法上使用 @BeforeAll@AfterAll 注解,这非常适合 Kotlin。spring-doc.cadn.net.cn

要模拟 Kotlin 类,推荐使用 MockK。 如果您需要相当于 Mockito 特有的 @MockitoBean@MockitoSpyBean 注解的 MockK 等价物,可以使用 SpringMockK,它提供了类似的 @MockkBean@SpykBean 注解。spring-doc.cadn.net.cn