Kotlin Support
Kotlin 是一种针对 JVM(和其他平台)的静态类型语言,它允许编写简洁优雅的代码,同时提供 {url-kotlin-docs}/java-interop.html[与用 Java 编写的现有库的互操作性]。
Spring Boot 通过利用其他 Spring 项目(如 Spring Framework、Spring Data 和 Reactor)中的支持提供 Kotlin 支持。有关详细信息,请参阅 {url-spring-framework-docs}/languages/kotlin.html[Spring Framework Kotlin 支持文档]。
开始使用 Spring Boot 和 Kotlin 的最简单方法是按照 this comprehensive tutorial进行操作。您可以使用 IntelliJ IDEA 创建新的 Kotlin 项目。如果您需要支持,请随时加入 Slack 上的 #spring 频道或在 Stack Overflow 上使用 spring
和 kotlin
标记提问。
Requirements
Spring Boot 至少需要 Kotlin 1.7.x,并通过依赖项管理管理一个合适的 Kotlin 版本。要使用 Kotlin,org.jetbrains.kotlin:kotlin-stdlib
和 org.jetbrains.kotlin:kotlin-reflect
必须存在于类路径中。也可以使用 kotlin-stdlib
变体 kotlin-stdlib-jdk7
和 kotlin-stdlib-jdk8
。
自 Kotlin classes are final by default 起,您可能希望配置 {url-kotlin-docs}/compiler-plugins.html#spring-support[kotlin-spring] 插件以自动打开带有 Spring 注释的类,这样它们就可以被代理。
Jackson’s Kotlin module是 Kotlin 中序列化/反序列化 JSON 数据所必需的。在类路径中找到时会自动注册它。如果存在 Jackson 和 Kotlin,但不存在 Jackson Kotlin 模块,则会记录一个警告消息。
如果在 start.spring.io上自举 Kotlin 项目,则默认情况下会提供这些依赖项和插件。 |
Null-safety
Kotlin 的一项主要功能是 {url-kotlin-docs}/null-safety.html[null-safety]。它在编译时处理 null`值,而不是将问题推迟到运行时并遇到 `NullPointerException
。这有助于消除常见的漏洞根源,而无需付出像 `Optional`这样的包装的代价。Kotlin 还允许将函数式构造与可空值一起使用,如 comprehensive guide to null-safety in Kotlin所示。
尽管 Java 不允许在类型系统中表达空安全,但 Spring Framework、Spring Data 和 Reactor 现在通过工具友好的注释提供了其 API 的空安全。默认情况下,Kotlin 中使用的 Java API 中的类型被识别为 {url-kotlin-docs}/java-interop.html#null-safety-and-platform-types[平台类型],因此对其放松了空检查。{url-kotlin-docs}/java-interop.html#jsr-305-support[Kotlin 对 JSR 305 注释的支持]与可空性注释相结合,为 Kotlin 中的 Spring API 提供了空安全。
可以通过添加带有以下选项的 -Xjsr305`编译器标志对 JSR 305 检查进行配置: `-Xjsr305={strict|warn|ignore}
。默认行为与 `-Xjsr305=warn`相同。 `strict`值需要在从 Spring API 推断的 Kotlin 类型中考虑空安全性,但应了解 Spring API 可空性声明即使在次要版本之间也可能会发生变化,将来可能会增加更多检查)。
泛型类型参数、可变参数和数组元素的可空性尚不受支持。有关最新信息,请参见 SPR-15942。还要注意 Spring Boot 自身的 API {url-github-issues}/10712[尚未注释]。
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)
}
Dependency management
为了避免在类路径上混合不同版本的 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的 reactive 依赖项在 Kotlin 项目中进行引导,则默认情况下会提供 `org.jetbrains.kotlinx:kotlinx-coroutines-reactor`依赖项。 |
@ConfigurationProperties
`@ConfigurationProperties`与 constructor binding结合使用时支持具有不可变 `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
)
}
要使用注释处理器生成 your own metadata,应该使用 |
Testing
虽然可以使用 JUnit 4 测试 Kotlin 代码,但默认情况下会提供 JUnit 5,并且建议使用它。JUnit 5 支持对测试类进行一次实例化并对该类的所有测试进行重用。这使得可以在非静态方法中使用 `@BeforeAll`和 `@AfterAll`注释,这非常适合 Kotlin。
要模拟 Kotlin 类,建议使用 MockK。如果你需要 Mockito 特定的 @MockBean
and @SpyBean
annotations的 `MockK`等效项,则可以使用 SpringMockK,它提供了类似的 `@MockkBean`和 `@SpykBean`注释。
Resources
Further reading
-
{url-kotlin-docs}[Kotlin language reference]
-
Kotlin Slack(带专用 #spring 通道)
-
Tutorial: building web applications with Spring Boot and Kotlin
-
A Geospatial Messenger with Kotlin, Spring Boot and PostgreSQL
Examples
-
spring-boot-kotlin-demo: 常规 Spring Boot + Spring Data JPA 项目
-
mixit: Spring Boot 2 + WebFlux + Reactive Spring Data MongoDB
-
spring-kotlin-fullstack:采用 Kotlin2js 而非 JavaScript 或 TypeScript 的 WebFlux Kotlin 全栈示例
-
spring-petclinic-kotlin:Spring PetClinic 样例应用程序的 Kotlin 版本
-
spring-kotlin-deepdive: 将 Boot 1.0 + Java 逐步迁移到 Boot 2.0 + Kotlin
-
spring-boot-coroutines-demo: Coroutines sample project