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 2.2.x,并通过依赖管理来管理合适的 Kotlin 版本。
要使用 Kotlin,类路径中必须包含 org.jetbrains.kotlin:kotlin-stdlib 和 org.jetbrains.kotlin:kotlin-reflect。
Kotlin 2.2.x 引入了新的注解传播默认规则,用于将注解传播到参数、字段和属性。为避免相关警告,并使用在即将发布的版本中很可能成为 Kotlin 默认行为的设置,建议配置编译器标志 -Xannotation-default-target=param-property。
由于Kotlin 类默认是 final 的,你很可能需要配置kotlin-spring插件,以便自动将带有 Spring 注解的类打开(open),使其能够被代理。
Jackson 的 Kotlin 模块 是在 Kotlin 中序列化/反序列化 JSON 数据所必需的。 当它在类路径中被发现时,会自动注册。
| 如果在 start.spring.io 上引导一个 Kotlin 项目,这些依赖项和插件将默认提供。 |
Null-safety
Kotlin 的关键特性之一是空安全。
它在编译时处理null值,而不是将问题推迟到运行时并遇到NullPointerException。
这有助于消除一个常见的错误来源,而无需付出像Optional这样的包装器的代价。
Kotlin 还允许对可空值使用函数式构造,如本Kotlin 空安全综合指南中所述。
从 Kotlin 2.1 起,Kotlin 开始强制严格处理来自 org.jspecify.annotations 包的可空性注解。
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: 异步计算样例项目