Kotlin是针对JVM(和其他平台)的静态类型的语言,它允许编写简洁明了的代码,同时提供与用Java编写的现有库的互操作性。
Spring Boot通过利用其他Spring项目(例如Spring Framework,Spring Data和Reactor)中的支持来提供Kotlin支持。有关更多信息,请参见Spring Framework Kotlin支持文档。
开始使用Spring Boot和Kotlin的最简单方法是遵循此综合教程。您可以通过start.spring.io创建新的Kotlin项目。如果需要支持,请随时加入Kotlin Slack的#spring频道,或通过Stack Overflow上的spring
andkotlin
标签提问。
30.1 要求
Spring Boot支持Kotlin1.3.x。要使用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项目,则默认情况下会提供这些依赖项和插件。 | |
---|---|
30.2 零安全
Kotlin的主要功能之一是null安全。它null
在编译时处理值,而不是将问题推迟到运行时并遇到NullPointerException
。这有助于消除常见的bug来源,而无需支付诸如此类的包装器的费用Optional
。Kotlin还允许使用具有可为空值的功能结构,如《Kotlin中关于null安全性的全面指南》中所述。
尽管Java不允许人们在其类型系统中表达null安全性,但是Spring Framework,Spring Data和Reactor现在通过易于使用工具的注释为API提供了null安全性。默认情况下,将Kotlin中使用的Java API中的类型识别为放松了空检查的平台类型。 Kotlin对JSR 305批注的支持与可空性批注相结合,为Kotlin中的相关Spring API提供了空安全性。
的JSR 305检查可以通过添加被配置-Xjsr305
具有以下选项的编译标志:-Xjsr305={strict|warn|ignore}
。默认行为与相同-Xjsr305=warn
。strict
从Spring API推断得出的Kotlin类型中,必须考虑到该值的空安全性,但应使用该值,前提是即使在次要发行版之间,Spring API空性声明也可能会演变,并且将来可能会添加更多检查)。
尚不支持泛型类型参数,varargs和数组元素的可空性。有关最新信息,请参见SPR-15942。另外请注意,Spring Boot自己的API尚未被注释。 | |
---|---|
30.3 Kotlin API
30.3.1 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)
}
30.3.2 扩展名
Kotlin扩展提供了使用其他功能扩展现有类的功能。Spring Boot Kotlin API利用这些扩展为现有的API添加了新的Kotlin特定的便利。TestRestTemplate
提供了类似于Spring FrameworkRestOperations
在Spring Framework中提供的扩展。除其他事项外,这些扩展使利用Kotlin修饰类型参数成为可能。
30.4 依赖管理
为了避免在类路径中混合使用不同版本的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项目,则默认情况下提供依赖项。 |
|
---|---|
30.5 @ConfigurationProperties
@ConfigurationProperties
当与@ConstructorBinding
具有不可变val
属性的支持类结合使用时,如以下示例所示:
@ConstructorBinding
@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提供的模型的限制,某些功能(例如检测默认值或不推荐使用的项目)无法正常工作。 |
|
---|---|
30.6 测验
虽然可以使用JUnit 4测试Kotlin代码,但默认情况下建议使用JUnit 5。JUnit 5使测试类可以实例化一次,并可以在该类的所有测试中重新使用。这样就可以在非静态方法上使用@BeforeAll
和@AfterAll
注释,这非常适合Kotlin。
要模拟Kotlin类,建议使用MockK。如果需要Mockk
Mockito特定于@MockBean
和@SpyBean
注释的等效项,则可以使用SpringMockK提供类似的@MockkBean
和@SpykBean
注释。
30.7 资源资源
30.7.1 进一步阅读
- Kotlin语言参考
- Kotlin Slack(带有专用的#spring频道)
- 带
spring
和kotlin
标签的Stackoverflow - 在浏览器中尝试Kotlin
- Kotlin博客
- 很棒的科特林
- 教程:使用Spring Boot和Kotlin构建Web应用程序
- 使用Kotlin开发Spring Boot应用程序
- 带有Kotlin,Spring Boot和PostgreSQL的地理空间Messenger
- 在Spring Framework 5.0中引入Kotlin支持
Spring Framework 5 Kotlin API的功能方式
30.7.2 示例
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:协程示例项目