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上使用spring
和kotlin
标签询问问题。
50.1 Requirements
Spring Boot 支持 Kotlin1.2.x。要使用 Kotlin,Classpath 上必须存在org.jetbrains.kotlin:kotlin-stdlib
和org.jetbrains.kotlin:kotlin-reflect
。也可以使用kotlin-stdlib
变体kotlin-stdlib-jdk7
和kotlin-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 专用便利。
提供了TestRestTemplate
extensions,类似于 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
}
}
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 进一步阅读
-
Kotlin Slack(带有专用的#spring Channels)
50.7.2 Examples
-
spring-boot-kotlin-demo:常规 Spring Boot Spring Data JPA 项目
-
mixit:Spring Boot 2 WebFlux Reactive Spring Data MongoDB
-
spring-kotlin-fullstack:WebFlux Kotlin 全栈示例,其中 Kotlin2js 用于前端,而不是 JavaScript 或 TypeScript
-
spring-petclinic-kotlin:Spring PetClinic 示例应用程序的 Kotlin 版本
-
spring-kotlin-deepdive:从 Boot 1.0 Java 到 Boot 2.0 Kotlin 的逐步迁移