|
此版本仍在开发中,尚未视为稳定版。如需最新稳定版本,请使用 Spring Boot 4.0.4! |
Kotlin 支持
Spring Boot 通过利用其他 Spring 项目(如 Spring Framework、Spring Data 和 Reactor)的支持来提供 Kotlin 支持。 See the Spring Framework Kotlin support documentation for more information.
The easiest way to start with Spring Boot and Kotlin is to follow 这个全面的教程。
You can create new Kotlin projects by using start.spring.io。
Feel free to join the #spring channel of Kotlin Slack or ask a question with the spring and kotlin tags on Stack Overflow if you need support.
要求
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 注解的类打开(open),使其能够被代理。
Jackson 的 Kotlin 模块 是在 Kotlin 中序列化/反序列化 JSON 数据所必需的。 当它在类路径中被发现时,会自动注册。
| 如果在 start.spring.io 上引导一个 Kotlin 项目,这些依赖项和插件将默认提供。 |
Null-safety
Kotlin 的关键特性之一是空安全。
它在编译时处理null值,而不是将问题推迟到运行时并遇到NullPointerException。
这有助于消除一个常见的错误来源,而无需付出像Optional这样的包装器的代价。
Kotlin 还允许对可空值使用函数式构造,如本Kotlin 空安全综合指南中所述。
尽管 Java 的类型系统不允许表达空安全(null-safety),但 Spring Framework、Spring Data 和 Reactor 现在通过友好的注解提供了它们 API 的空安全。 默认情况下,Kotlin 中使用的 Java API 类型被视为 平台类型,其中的空检查是宽松的。 Kotlin 对 JSR 305 注解的支持 结合 nullability 注解为相关 Spring API 在 Kotlin 中提供了空安全。
JSR 305 检查可以通过添加以下编译标志来配置:-Xjsr305。
默认行为与 -Xjsr305={strict|warn|ignore} 相同。
-Xjsr305=warn 值要求在 Kotlin 类型从 Spring API 推断时考虑 null 安全性,但应知道 Spring API 的 null 性声明可能会在不同次要版本之间发生变化,并且将来可能还会增加更多的检查。
Kotlin API
运行应用程序
Spring Boot 提供了一种 idiomatic 的方式来运行一个应用,如以下示例所示:
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 extensions 提供了扩展现有类以添加额外功能的能力。 The Spring Boot Kotlin API 利用这些扩展来为现有的 API 添加新的 Kotlin 特定便利功能。
TestRestTemplate 扩展,类似于 Spring Framework 为 RestOperations 在 Spring Framework 中提供的扩展,现已提供。
除其他功能外,这些扩展使得利用 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属性来自定义。
org.jetbrains.kotlinx:kotlinx-coroutines-reactor 依赖项会在使用 start.spring.io 初始化包含至少一个响应式依赖的 Kotlin 项目时默认提供。 |
@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
)
}
由于值类与Java的互操作性有限,因此对其支持是有限的。 特别是,依赖于值类的默认值将无法与配置属性绑定工作。 在这种情况下,应使用数据类代替。
测试
虽然可以使用 JUnit 4 来测试 Kotlin 代码,但默认提供并推荐使用 JUnit 5。
JUnit 5 允许测试类只实例化一次,并在该类的所有测试中重复使用。
这使得可以在非静态方法上使用 @BeforeAll 和 @AfterAll 注解,这非常适合 Kotlin。
要模拟 Kotlin 类,推荐使用 MockK。
如果您需要相当于 Mockito 特有的 @MockitoBean 和 @MockitoSpyBean 注解的 MockK 等价物,可以使用 SpringMockK,它提供了类似的 @MockkBean 和 @SpykBean 注解。
资源
<h1>示例</h1>
-
spring-boot-kotlin-demo: regular Spring Boot + Spring Data JPA项目
-
mixit:Spring Boot 2 + WebFlux + 响应式 Spring Data MongoDB
-
spring-kotlin-fullstack: WebFlux Kotlin 全栈示例,前端使用 Kotlin2js 而不是 JavaScript 或 TypeScript
-
spring-petclinic-kotlin: Kotlin版本的Spring PetClinic样例应用
-
spring-kotlin-deepdive: 一个从Boot 1.0 + Java到Boot 2.0 + Kotlin的逐步迁移指南
-
spring-boot-coroutines-demo: 异步计算样例项目