https://docs.spring.io/spring-boot/docs/3.2.0/reference/htmlsingle/#features.kotlin
Kotlin 是一种面向 JVM(以及它他平台)的静态类型语言,它允许编写简洁而优雅的代码,同时提供与用 Java 编写的现有库的互操作性。
Spring Boot 通过利用 Spring Framework、Spring Data 和 Reactor 等它他 Spring 项目中的支持来提供对 Kotlin 的支持。
要求
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 类默认是 final 的,你可能希望配置 kotlin-spring
插件,以便自动打开带有 Spring 注解的类,以便它们可以被代理。
要在 Kotlin 中序列化/反序列化 JSON 数据,需要 Jackson 的 Kotlin
模块。当在类路径中找到该模块时,会自动注册它。如果 Jackson 和 Kotlin 都存在,但 Jackson Kotlin 模块不存在,则会记录一条警告消息。
提示:如果在 start.spring.io
上启动 Kotlin 项目,则默认会提供这些依赖项和插件。
空值安全(Null-safety)
Kotlin 的一个关键特性是空值安全(null-safety)。它在编译时处理空值,而不是将问题推迟到运行时并遇到 NullPointerException
。这有助于消除常见的错误来源,而无需支付像 Optional
这样的包装器的成本。此外,Kotlin 还允许使用带空值的函数式构造。
虽然 Java 的类型系统不允许表达空值安全,但 Spring Framework、Spring Data 和 Reactor 现在通过易于使用的注解提供了其 API 的空值安全。默认情况下,在 Kotlin 中使用的 Java API 的类型被识别为平台类型,对其的空值检查是放宽的。Kotlin 对 JSR 305 注解的支持与空值性注解相结合,为相关的 Spring API 提供了 Kotlin 中的空值安全。
JSR 305 检查可以通过添加以下选项的 -Xjsr305
编译器标志来配置:-Xjsr305={strict|warn|ignore}
。默认行为与 -Xjsr305=warn
相同。strict
值要求 Kotlin 从 Spring API 推断的类型中考虑空值安全,但应知道 Spring API 的空值性声明即使在次要版本之间也可能有所发展,并且将来可能会添加更多检查。
注意:泛型类型参数、varargs 和数组元素的空值性尚不支持。
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)
}
扩展(Extensions)
Kotlin 扩展 提供了为现有类添加额外功能的能力。Spring Boot Kotlin API 利用这些扩展来为现有 API 添加新的 Kotlin 特定便利性。
提供了与 Spring Framework 中为 RestOperations
提供的扩展类似的 TestRestTemplate
扩展。除此之外,这些扩展还使得可以利用 Kotlin 的具体化类型参数。
依赖管理
为了避免在类路径上混合不同版本的 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
属性来自定义版本。
提示:如果在 start.spring.io
上使用至少一个响应式依赖项引导 Kotlin 项目,那么会默认提供 org.jetbrains.kotlinx:kotlinx-coroutines-reactor
依赖项。
@ConfigurationProperties
当与构造函数绑定结合使用时,@ConfigurationProperties
支持具有不可变 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
)
}
提示:要使用注解处理器生成自己的元数据,应将 kapt 配置为具有 spring-boot-configuration-processor
依赖项。请注意,由于 kapt 提供的模型存在限制,某些功能(如检测默认值或已弃用的项)可能无法正常工作。
测试(Testing)
虽然可以使用 JUnit 4 来测试 Kotlin 代码,但默认提供并推荐使用 JUnit 5。JUnit 5 允许测试类只实例化一次并用于类中的所有测试。这使得可以在非静态方法上使用 @BeforeAll
和 @AfterAll
注解,这非常适合 Kotlin。
要模拟 Kotlin 类,建议使用 MockK
。如果需要 MockK
与 Mockito
特定的 @MockBean
和 @SpyBean
注解的等效项,可以使用 SpringMockK
,它提供了类似的 @MockkBean
和 @SpykBean
注解。