Kotlin 支援
Spring Boot 透過利用 Spring Framework、Spring Data 和 Reactor 等其他 Spring 專案中的支援來提供 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 的關鍵特性之一是空安全。它在編譯時處理 null
值,而不是將問題推遲到執行時遇到 NullPointerException
。這有助於消除一個常見的錯誤來源,而無需為 Optional
等包裝器付出代價。Kotlin 還允許使用函式式構造處理可空值,如這篇關於 Kotlin 空安全的綜合指南中所述。
儘管 Java 不允許在其型別系統中表達空安全,但 Spring Framework、Spring Data 和 Reactor 現在透過工具友好的註解提供了其 API 的空安全。預設情況下,在 Kotlin 中使用的 Java API 中的型別被識別為平臺型別,對其進行了空檢查放寬。結合空性註解,Kotlin 對 JSR 305 註解的支援在 Kotlin 中為相關的 Spring API 提供了空安全。
可以透過新增 -Xjsr305
編譯器標誌並使用以下選項來配置 JSR 305 檢查:-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 為 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。如果你需要 MockK 相當於 Mockito 特有的 @MockitoBean
和 @MockitoSpyBean
註解,可以使用 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 全棧示例,前端使用 Kotlin2js 而非 JavaScript 或 TypeScript
-
spring-petclinic-kotlin:Spring PetClinic 示例應用程式的 Kotlin 版本
-
spring-kotlin-deepdive:從 Boot 1.0 + Java 逐步遷移到 Boot 2.0 + Kotlin
-
spring-boot-coroutines-demo:協程示例專案