Kotlin 支援
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
和 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 註解的類別,使其可以被代理。
Jackson 的 Kotlin 模組是 Kotlin 中序列化/反序列化 JSON 資料所必需的。當在類別路徑中找到它時,它會自動註冊。如果 Jackson 和 Kotlin 都存在,但 Jackson Kotlin 模組不存在,則會記錄警告訊息。
如果在 start.spring.io 上引導啟動 Kotlin 專案,則預設會提供這些依賴和外掛程式。 |
空值安全
Kotlin 的主要功能之一是 空值安全。它在編譯時處理空值,而不是將問題延遲到運行時並遇到 NullPointerException
。這有助於消除常見的錯誤來源,而無需付出像 Optional
這樣的包裝器的成本。Kotlin 也允許將函數式結構與可空值一起使用,如這份 Kotlin 空值安全綜合指南中所述。
雖然 Java 不允許在其型別系統中表達空值安全,但 Spring Framework、Spring Data 和 Reactor 現在透過工具友善的註解提供其 API 的空值安全。預設情況下,Kotlin 中使用的 Java API 的型別被識別為 平台型別,對其進行了空值檢查放寬。Kotlin 對 JSR 305 註解的支援與可空性註解相結合,為 Kotlin 中相關的 Spring API 提供了空值安全。
JSR 305 檢查可以透過新增 -Xjsr305
編譯器標誌以及以下選項進行配置:-Xjsr305={strict|warn|ignore}
。預設行為與 -Xjsr305=warn
相同。strict 值是必需的,以便在從 Spring API 推斷的 Kotlin 型別中考慮空值安全,但應在使用時了解 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 為 Spring Framework 中的 RestOperations
提供的擴展。除其他外,這些擴展使得利用 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
)
}
由於它們與 Java 的互操作性限制,對值類別的支援受到限制。特別是,依賴值類別的預設值將無法與組態屬性綁定一起使用。在這種情況下,應改用資料類別。
測試
雖然可以使用 JUnit 4 來測試 Kotlin 程式碼,但預設提供 JUnit 5 並建議使用。JUnit 5 允許測試類別實例化一次並重複用於類別的所有測試。這使得可以在非靜態方法上使用 @BeforeAll
和 @AfterAll
註解,這非常適合 Kotlin。
要模擬 Kotlin 類別,建議使用 MockK。如果您需要 Mockito 特定的 @MockBean
和 @SpyBean
註解 的 MockK 等效項,您可以使用 SpringMockK,它提供類似的 @MockkBean
和 @SpykBean
註解。
資源
延伸閱讀
-
Kotlin Slack (設有專門的 #spring 頻道)
範例
-
spring-boot-kotlin-demo:常規 Spring Boot + Spring Data JPA 專案
-
mixit:Spring Boot 2 + WebFlux + Reactive Spring Data MongoDB
-
spring-kotlin-fullstack:WebFlux Kotlin fullstack 範例,前端使用 Kotlin2js 而不是 JavaScript 或 TypeScript
-
spring-petclinic-kotlin:Spring PetClinic 範例應用程式的 Kotlin 版本
-
spring-kotlin-deepdive:從 Boot 1.0 + Java 到 Boot 2.0 + Kotlin 的逐步遷移
-
spring-boot-coroutines-demo:協程範例專案