50. Kotlin support

Kotlin是针对 JVM(和其他平台)的静态类型的语言,它允许编写简洁明了的代码,同时为interoperability提供以 Java 编写的现有库。

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

从 Spring Boot 和 Kotlin 开始的最简单方法是遵循本综合教程。您可以通过start.spring.io创建新的 Kotlin 项目。如果需要支持,可以随时加入Kotlin Slack的#spring Channels,或在Stack Overflow上使用springkotlin标签询问问题。

50.1 Requirements

Spring Boot 支持 Kotlin1.2.x。要使用 Kotlin,Classpath 上必须存在org.jetbrains.kotlin:kotlin-stdliborg.jetbrains.kotlin:kotlin-reflect。也可以使用kotlin-stdlib变体kotlin-stdlib-jdk7kotlin-stdlib-jdk8

Kotlin 类默认为 final开始,您可能需要配置kotlin-spring插件,以便自动打开带有 Spring Comments 的类,以便对其进行代理。

在 Kotlin 中序列化/反序列化 JSON 数据需要Jackson 的 Kotlin 模块。在 Classpath 上找到它会自动注册。如果存在 Jackson 和 Kotlin 但不存在 Jackson Kotlin 模块,则会记录一条警告消息。

Tip

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

50.2 Null-safety

Kotlin 的主要功能之一是null-safety。它在编译时处理null值,而不是将问题推迟到运行时并遇到NullPointerException。这有助于消除常见的错误源,而无需支付Optional之类的包装器的费用。 Kotlin 还允许使用具有可空值的函数构造,如Kotlin 空安全综合指南中所述。

尽管 Java 不允许人在其类型系统中表示空安全性,但 Spring Framework,Spring Data 和 Reactor 现在通过易于使用工具的注解为 API 提供了空安全性。默认情况下,Kotlin 中使用的 Java API 中的类型被识别为platform types,对此类型的空检查得到了放宽。 Kotlin 对 JSR 305 注解的支持与可空性 Comments 结合使用,为 Kotlin 中的相关 Spring API 提供了空安全性。

可以通过添加带有以下选项的-Xjsr305编译器标志来配置 JSR 305 检查:-Xjsr305={strict|warn|ignore}。默认行为与-Xjsr305=warn相同。必须使用strict值来考虑从 Spring API 推断出的 Kotlin 类型的空安全性,但应使用该知识,即使 Spring API 的空性声明即使在次要发行版之间也可能会演变,并且将来可能会添加更多检查,这一点应得到使用。

Warning

尚不支持泛型类型参数,varargs 和数组元素的可空性。有关最新信息,请参见SPR-15942。另外请注意,Spring Boot 自己的 API 是尚未 Comments

50.3 Kotlin API

50.3.1 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)
}

50.3.2 Extensions

Kotlin extensions提供了使用其他功能扩展现有类的功能。 Spring Boot Kotlin API 利用这些扩展为现有 API 添加了新的 Kotlin 专用便利。

提供了TestRestTemplateextensions,类似于 Spring Framework 为RestOperations在 Spring Framework 中提供的 extensions。除其他事项外,这些扩展使利用 Kotlin 修饰类型参数成为可能。

50.4 依赖性 Management

为了避免在 Classpath 上混合使用不同版本的 Kotlin 依赖项,提供了以下 Kotlin 依赖项的依赖项 Management:

  • kotlin-reflect

  • kotlin-runtime

  • kotlin-stdlib

  • kotlin-stdlib-jdk7

  • kotlin-stdlib-jdk8

  • kotlin-stdlib-jre7

  • kotlin-stdlib-jre8

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

50.5 @ConfigurationProperties

@ConfigurationProperties目前仅适用于lateinit或可为空的var属性(建议使用前者),因为构造函数初始化的不可变类为尚不支持

@ConfigurationProperties("example.kotlin")
class KotlinExampleProperties {

	lateinit var name: String

	lateinit var description: String

	val myService = MyService()

	class MyService {

		lateinit var apiToken: String

		lateinit var uri: URI

	}

}

Tip

要使用 Comments 处理器生成您自己的元数据,具有spring-boot-configuration-processor依赖性的kapt 应该配置

50.6 Testing

虽然可以使用 JUnit 4(由spring-boot-starter-test提供的默认值)来测试 Kotlin 代码,但建议使用 JUnit 5. JUnit 5 使一个测试类可以实例化一次,并可以重新用于该类的所有测试。这样就可以在非静态方法上使用@BeforeAll@AfterAll注解,这非常适合 Kotlin。

要使用 JUnit 5,请从spring-boot-starter-test中排除junit:junit依赖性,添加 JUnit 5 依赖性,并相应地配置 Maven 或 Gradle 插件。有关更多详细信息,请参见JUnit 5 文档。您还需要将测试实例生命周期切换为“每个类”

50.7 Resources

50.7.1 进一步阅读

50.7.2 Examples