Spring Boot中文參考指南(2.1.6)50、Kotlin 支持

下一篇[未完待續]

Spring Boot中文參考指南(2.1.6)50、Kotlin 支持

<code>英文原文:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-kotlin.html/<code>
<code>GitHub:https://github.com/jijicai/Spring/tree/master/spring-boot/<code>

50、Kotlin 支持

Kotlin 是一種針對 JVM(和其他平臺)的靜態類型語言,它允許編寫簡潔而優雅的代碼,同時提供與用 Java 編寫的現有庫的互操作性。

Spring Boot 通過利用其他 Spring 項目(如 Spring Framework、 Spring Data 和 Reactor) 中的支持來提供 Kotlin 支持。有關更多信息,請參見 Spring Framework Kotlin 支持文檔。(https://docs.spring.io/spring/docs/5.1.8.RELEASE/spring-framework-reference/languages.html#kotlin )

從 Spring Boot 和 Kotlin 開始的最簡單的方法是遵循這個全面的教程。你可以通過 start.spring.io 創建新的 Kotlin 項目。如果你需要支持,請隨時加入 Kotlin Slack 的 #spring 頻道,或者在 Stack Overflow 上詢問 spring 和 kotlin 標籤的問題。

50.1、要求

Spring Boot 支持 Kotlin 1.2.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 項目,則默認提供這些依賴項和插件。

50.2、空安全

Kotlin 的一個關鍵特性是空安全性。它在編譯時處理空值,而不是將問題推遲到運行時並遇到 NullPointerException。這有助於消除常見的錯誤源,而不必像 Optional 那樣支付包裝器的成本。Kotlin 還允許使用函數式構造,其值可以為空,如 Kotlin 中的空安全性綜合指南所述。

儘管 Java 不允許在其類型系統中表達空安全性,但 Spring Framework、Spring Data 和 Reactor 現在通過工具友好的註解為其 API 提供空安全性。默認情況下,Kotlin 中使用的 Java APIs 中的類型被識別為可以放寬空檢查的平臺類型。Kotlin 對 JSR 305 註解的支持結合可空性註解為 Kotlin 中的相關 Spring API 提供了空安全性。

JSR 305 檢查可以通過添加帶有以下選項的 -Xjsr305 編譯器標誌來配置:-Xjsr305={strict | warn | ignore}。默認行為與 -Xjsr305=warn 相同。strict 值要求在從 Spring API 推斷的 Kotlin 類型中考慮空安全性,但應在使用時知道 Spring API 可空性聲明可能會在較小的版本之間演變,並且將來可能會添加更多的檢查。

警告:還不支持泛型類型參數、可變參數 和數組元素的可空性。有關最新信息,請參閱 SPR-15942。還要注意,Spring Boot 自己的 API 還沒有註解。(https://github.com/spring-projects/spring-boot/issues/10712 )

50.3、Kotlin API

50.3.1、runApplication

Spring Boot 提供了一種慣用的方法來運行帶有 runApplication<myapplication>(*args) 的應用程序,如下面示例所示:/<myapplication>

Spring Boot中文參考指南(2.1.6)50、Kotlin 支持

<code>import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class MyApplication

fun main(args: Array<string>) {
runApplication<myapplication>(*args)
}/<myapplication>/<string>/<code>

這是 SpringApplication.run(MyApplication::class.java, *args) 的一個嵌入式替代品。它還允許自定義應用程序,如下面示例所示:

Spring Boot中文參考指南(2.1.6)50、Kotlin 支持

<code>runApplication<myapplication>(*args) {
setBannerMode(OFF)
}/<myapplication>/<code>

50.3.2、擴展

Kotlin 擴展提供了用附加功能擴展現有類的能力。Spring Boot Kotlin API 利用這些擴展為現有 API 添加新的 Kotlin 特有的便利性。

提供了 TestRestTemplate 擴展,類似於 Spring Framework 中用於 RestOperations 的 Spring Framework 提供的擴展。除此之外,這些擴展使得利用 Kotlin 具體化類型參數成為可能。

50.4、依賴管理

為了避免在類路徑上混合不同版本的 Kotlin 依賴項,提供了以下 Kotlin 依賴項的依賴項管理:

<code>kotlin-reflect
kotlin-runtime
kotlin-stdlib
kotlin-stdlib-jdk7
kotlin-stdlib-jdk8
kotlin-stdlib-jre7
kotlin-stdlib-jre8/<code>

使用 Maven,可以通過 kotlin.version 屬性自定義 Kotlin 版本,併為 kotlin-maven-plugin 提供插件管理。使用 Gradle,Spring Boot 插件會自動將 kotlin.version 與 Kotlin 插件的版本對齊。

50.5、@ConfigurationProperties

@ConfigurationProperties 當前僅適用於 lateinit 或可為空的 var 屬性(建議使用前者),因為尚不支持由構造函數初始化的不可變類。(https://github.com/spring-projects/spring-boot/issues/8762 )

Spring Boot中文參考指南(2.1.6)50、Kotlin 支持

<code>@ConfigurationProperties("example.kotlin")
class KotlinExampleProperties {

lateinit var name: String

lateinit var description: String

val myService = MyService()

class MyService {

lateinit var apiToken: String

lateinit var uri: URI

}

}/<code>

提示:要使用註解處理器生成你自己的元數據,應使用 spring-boot-configuration-processor 依賴項配置 kapt。

50.6、測試

雖然可以使用 JUnit 4(spring-boot-starter-test 提供的默認值)來測試 Kotlin 代碼,但建議使用 JUnit 5。JUnit 5 使測試類可以被實例化一次,並可重複用於該類的所有測試。這使得在非靜態方法上使用 @BeforeAll 和 @AfterAll 註解成為可能,這對於 Kotlin 來說是一個很好的選擇。

要使用 JUnit 5,請從 spring-boot-starter-test 中排除 junit:junit 依賴項,添加 JUnit 5 依賴項,並相應地配置 Maven 或 Gradle 插件。有關更多詳細信息,請參見 JUnit 5 文檔。你還需要將測試實例生命週期切換為 “每類”。

為了模擬 Kotlin 類,建議使用 MockK。如果你需要與 Mockito 特定的 @MockBean 和 @SpyBean 註解等效的 Mockk,則可以使用提供類似 @MockBean 和 @SpykBean 註解的 SpringMockK。

50.7、資源

50.7.1、延伸閱讀

(1)Kotlin 語言參考(https://kotlinlang.org/docs/reference/ )

(2)Kotlin Slack(配有專用 #spring 頻道)(https://slack.kotlinlang.org/ )

(3)帶 spring 和 kotlin 標籤的 Stackoverflow(https://stackoverflow.com/questions/tagged/spring+kotlin )

(4)在瀏覽器中嘗試 Kotlin(https://try.kotlinlang.org/ )

(5)Kotlin 博客(https://blog.jetbrains.com/kotlin/ )

(6)棒極了的 Kotlin(https://kotlin.link/ )

(7)教程:使用 Spring Boot 和 Kotlin 構建 web 應用程序(https://spring.io/guides/tutorials/spring-boot-kotlin/)

(8)使用 Kotlin 開發 Spring Boot 應用程序(https://spring.io/blog/2016/02/15/developing-spring-boot-applications-with-kotlin )

(9)帶有 Kotlin 、 Spring Boot 和 PostgreSQL 的地理空間信使(https://spring.io/blog/2016/03/20/a-geospatial-messenger-with-kotlin-spring-boot-and-postgresql )

(10)在 Spring Framework 5.0 中引入 Kotlin 支持(https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0 )

(11)Spring Framework 5 Kotlin APIs,函數式方式(https://spring.io/blog/2017/08/01/spring-framework-5-kotlin-apis-the-functional-way )

50.7.2、示例

(1)spring-boot-kotlin-demo:常規 Spring Boot + Spring Data JPA 項目(https://github.com/sdeleuze/spring-boot-kotlin-demo )

(2)mixit:Spring Boot 2 + WebFlux + Reactive Spring Data MongoDB(https://github.com/mixitconf/mixit )

(3)spring-kotlin-fullstack:WebFlux Kotlin 全棧示例,其中 Kotlin2js 用於前端,而不是 JavaScript 或 TypeScript(https://github.com/sdeleuze/spring-kotlin-fullstack )

(4)spring-petclinic-kotlin:Kotlin 版本的 Spring PetClinic 示例應用程序(https://github.com/spring-petclinic/spring-petclinic-kotlin )

(5)spring-kotlin-deepdive:Boot 1.0 + Java 到 Boot 2.0 + Kotlin 的逐步遷移(https://github.com/sdeleuze/spring-kotlin-deepdive )

51、延伸閱讀

如果你想了解本節中討論的任何類的更多信息,可以查看 Spring Boot API 文檔,也可以直接瀏覽源代碼。如果你有具體問題,請查看操作指南部分。

如果你對 Spring Boot 的核心功能感到滿意,你可以繼續閱讀有關生產就緒功能的內容。(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/production-ready.html )

下一篇[未完待續]


分享到:


相關文章: