Kotlin是针对JVM(和其他平台)的静态类型的语言,它允许编写简洁明了的代码,同时提供与用Java编写的现有库的互操作性
Spring Boot通过利用其他Spring项目(例如Spring Framework,Spring Data和Reactor)中的支持来提供Kotlin支持。有关更多信息,请参见Spring Framework Kotlin支持文档
开始使用Spring Boot和Kotlin的最简单方法是遵循此综合教程。您可以通过start.spring.io创建新的Kotlin项目。如果需要支持,请随时加入Kotlin Slack的#spring频道,或通过Stack Overflow上的springandkotlin标签提问。

30.1 要求

Spring Boot支持Kotlin1.3.x。要使用Kotlin,org.jetbrains.kotlin:kotlin-stdlib并且org.jetbrains.kotlin:kotlin-reflect必须存在于类路径中。该kotlin-stdlib变种kotlin-stdlib-jdk7kotlin-stdlib-jdk8也可以使用。
由于默认情况下Kotlin类是final类,因此您可能需要配置kotlin-spring插件,以便自动打开带有Spring注释的类,以便可以对其进行代理。
在Kotlin中序列化/反序列化JSON数据时,需要Jackson的Kotlin模块。在类路径上找到它会自动注册。如果存在Jackson和Kotlin但不存在Jackson Kotlin模块,则会记录一条警告消息。

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

30.2 零安全

Kotlin的主要功能之一是null安全。它null在编译时处理值,而不是将问题推迟到运行时并遇到NullPointerException。这有助于消除常见的bug来源,而无需支付诸如此类的包装器的费用Optional。Kotlin还允许使用具有可为空值的功能结构,如《Kotlin中关于null安全性的全面指南》中所述
尽管Java不允许人们在其类型系统中表达null安全性,但是Spring Framework,Spring Data和Reactor现在通过易于使用工具的注释为API提供了null安全性。默认情况下,将Kotlin中使用的Java API中的类型识别为放松了空检查的平台类型Kotlin对JSR 305批注的支持与可空性批注相结合,为Kotlin中的相关Spring API提供了空安全性。
的JSR 305检查可以通过添加被配置-Xjsr305具有以下选项的编译标志:-Xjsr305={strict|warn|ignore}。默认行为与相同-Xjsr305=warnstrict从Spring API推断得出的Kotlin类型中,必须考虑到该值的空安全性,但应使用该值,前提是即使在次要发行版之间,Spring API空性声明也可能会演变,并且将来可能会添加更多检查)。

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

30.3 Kotlin API

30.3.1 runApplication

Spring Boot提供了一种惯用的方式来运行应用程序,runApplication<MyApplication>(*args)如下例所示:

  1. import org.springframework.boot.autoconfigure.SpringBootApplication
  2. import org.springframework.boot.runApplication
  3. @SpringBootApplication
  4. class MyApplication
  5. fun main(args: Array<String>) {
  6. runApplication<MyApplication>(*args)
  7. }

这是的直接替代SpringApplication.run(MyApplication::class.java, *args)。它还允许自定义应用程序,如以下示例所示:

  1. runApplication<MyApplication>(*args) {
  2. setBannerMode(OFF)
  3. }

30.3.2 扩展名

Kotlin扩展提供了使用其他功能扩展现有类的功能。Spring Boot Kotlin API利用这些扩展为现有的API添加了新的Kotlin特定的便利。
TestRestTemplate提供了类似于Spring FrameworkRestOperations在Spring Framework中提供的扩展。除其他事项外,这些扩展使利用Kotlin修饰类型参数成为可能。

30.4 依赖管理

为了避免在类路径中混合使用不同版本的Kotlin依赖项,Spring Boot会导入Kotlin BOM。
使用Maven,可以通过kotlin.version属性自定义Kotlin版本,并为提供插件管理kotlin-maven-plugin。使用Gradle,Spring Boot插件会自动将其kotlin.version与Kotlin插件的版本对齐。
Spring Boot还通过导入Kotlin Coroutines BOM管理Coroutines依赖项的版本。可以通过kotlin-coroutines.version属性自定义版本。

org.jetbrains.kotlinx:kotlinx-coroutines-reactor如果一个引导程序在start.spring.io上至少有一个反应性依赖项的Kotlin项目,则默认情况下提供依赖

30.5 @ConfigurationProperties

@ConfigurationProperties当与@ConstructorBinding具有不可变val属性的支持类结合使用时,如以下示例所示:

  1. @ConstructorBinding
  2. @ConfigurationProperties("example.kotlin")
  3. data class KotlinExampleProperties(
  4. val name: String,
  5. val description: String,
  6. val myService: MyService) {
  7. data class MyService(
  8. val apiToken: String,
  9. val uri: URI
  10. )
  11. }
要生成自己的元数据使用注释处理器,kapt应该配置spring-boot-configuration-processor依赖。请注意,由于kapt提供的模型的限制,某些功能(例如检测默认值或不推荐使用的项目)无法正常工作。

30.6 测验

虽然可以使用JUnit 4测试Kotlin代码,但默认情况下建议使用JUnit 5。JUnit 5使测试类可以实例化一次,并可以在该类的所有测试中重新使用。这样就可以在非静态方法上使用@BeforeAll@AfterAll注释,这非常适合Kotlin。
要模拟Kotlin类,建议使用MockK。如果需要MockkMockito特定于@MockBean@SpyBean注释的等效项,则可以使用SpringMockK提供类似的@MockkBean@SpykBean注释。

30.7 资源资源

30.7.1 进一步阅读