Kotlin 支持
Spring Boot 通过利用其他 Spring 项目(如 Spring Framework、Spring Data 和 Reactor)中的支持来提供 Kotlin 支持。 有关更多信息,请参阅 Spring Framework Kotlin 支持文档。
开始使用 Spring Boot 和 Kotlin 的最简单方法是遵循此综合教程。
您可以使用 start.spring.io 创建新的 Kotlin 项目。
请随时加入 Kotlin Slack 的 #spring 频道,或使用spring和kotlin标签(如果您需要支持)。
要求
Spring Boot 至少需要 Kotlin 1.7.x,并通过依赖项管理管理合适的 Kotlin 版本。
要使用 Kotlin,org.jetbrains.kotlin:kotlin-stdlib和org.jetbrains.kotlin:kotlin-reflect必须存在于 Classpath 中。
这kotlin-stdlib变种kotlin-stdlib-jdk7和kotlin-stdlib-jdk8也可以使用。
由于 Kotlin 类默认是 final,因此您可能希望配置 kotlin-spring 插件,以便自动打开 Spring 注释的类,以便可以代理它们。
在 Kotlin 中序列化/反序列化 JSON 数据需要 Jackson 的 Kotlin 模块。 在 Classpath 上找到它时,它会自动注册。 如果存在 Jackson 和 Kotlin,但不存在 Jackson Kotlin 模块,则会记录一条警告消息。
| 如果在 start.spring.io 上引导 Kotlin 项目,则默认提供这些依赖项和插件。 |
Null 安全
Kotlin 的主要功能之一是 null 安全。
它涉及null值,而不是将问题推迟到运行时并遇到NullPointerException.
这有助于消除常见的错误来源,而无需支付包装器的成本,例如Optional.
Kotlin 还允许使用具有可为 null 值的函数结构,如本 Kotlin 中的 null 安全性综合指南中所述。
尽管 Java 不允许在其类型系统中表达 null 安全性,但 Spring Framework、Spring Data 和 Reactor 现在通过工具友好的注释提供其 API 的 null 安全性。 默认情况下,Kotlin 中使用的 Java API 中的类型被识别为放宽了 null 检查的平台类型。Kotlin 对 JSR 305 注释的支持与可为 null 性注释相结合,为 Kotlin 中的相关 Spring API 提供了空安全性。
JSR 305 检查可以通过添加-Xjsr305compiler 标志替换为以下选项:-Xjsr305={strict|warn|ignore}.
默认行为与-Xjsr305=warn.
这strictvalue 需要在从 Spring API 推断的 Kotlin 类型中考虑 null-safety ,但应该知道 Spring API 可空性声明甚至在次要版本之间也可能演变,并且将来可能会添加更多检查)。
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)
}
扩展
Kotlin 扩展提供了使用其他功能扩展现有类的功能。 Spring Boot Kotlin API 利用这些扩展为现有 API 添加新的 Kotlin 特定便利。
TestRestTemplate扩展,类似于 Spring Framework 为RestOperations在 Spring Framework 中。
此外,这些扩展还可以利用 Kotlin 具体化类型参数。
依赖关系管理
为了避免在 Classpath 上混合不同版本的 Kotlin 依赖项, Spring Boot 导入了 Kotlin BOM。
使用 Maven 时,可以通过设置kotlin.version属性和插件管理kotlin-maven-plugin.
使用 Gradle 时,Spring Boot 插件会自动将kotlin.version替换为 Kotlin 插件的版本。
Spring Boot 还通过导入 Kotlin Coroutines BOM 来管理 Coroutines 依赖项的版本。
可以通过设置kotlin-coroutines.version财产。
org.jetbrains.kotlinx:kotlinx-coroutines-reactor如果引导 Kotlin 项目时至少有一个对 start.spring.io 的响应式依赖项,则默认提供依赖项。 |
@ConfigurationProperties
@ConfigurationProperties当与构造函数结合使用时,绑定支持具有 Immutable 的数据类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
)
}
由于它们与 Java 的互作性受到限制,因此对值类的支持受到限制。 特别是,依赖 value 类的默认值不适用于 configuration property binding。 在这种情况下,应改用数据类。
测试
虽然可以使用 JUnit 4 来测试 Kotlin 代码,但 JUnit 5 是默认提供的,建议使用 JUnit 5。
JUnit 5 允许测试类实例化一次,并重复用于该类的所有测试。
这使得使用@BeforeAll和@AfterAll非静态方法的注解,非常适合 Kotlin。
要模拟 Kotlin 类,建议使用 MockK。
如果您需要MockK相当于 Mockito 特定的@MockitoBean和@MockitoSpyBean注解,你可以使用 SpringMockK,它提供类似的@MockkBean和@SpykBean附注。
资源
例子
-
spring-boot-kotlin-demo:常规 Spring Boot + Spring Data JPA 项目
-
mixit:Spring Boot 2 + WebFlux + 响应式 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 的分步迁移
-
spring-boot-coroutines-demo:协程示例项目