このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Boot 3.5.7 を使用してください! |
Kotlin サポート
Kotlin (英語) は、JVM(および他のプラットフォーム)を対象とする静的に型付けされた言語で、Java で記述された既存のライブラリとの相互運用性 (英語) を提供しながら、簡潔でエレガントなコードを記述できます。
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 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 (英語) 以降、プロキシできるように Spring アノテーション付きクラスを自動的に開くために、kotlin-spring (英語) プラグインを構成することをお勧めします。
Jackson の Kotlin モジュール [GitHub] (英語) は、Kotlin で JSON データをシリアライズ / デシリアライズするために必要です。クラスパスで見つかると自動的に登録されます。Jackson および Kotlin が存在するが、Jackson Kotlin モジュールが存在しない場合、警告メッセージがログに記録されます。
| これらの依存関係とプラグインは、start.spring.io で Kotlin プロジェクトをブートストラップする場合にデフォルトで提供されます。 |
null セーフ
Kotlin の重要な機能の 1 つは、null 安全性 (英語) です。問題を実行時に延期して NullPointerException (標準 Javadoc) に遭遇するのではなく、コンパイル時に null 値を処理します。これにより、Optional (標準 Javadoc) などのラッパーのコストを支払うことなく、一般的なバグの原因を排除できます。Kotlin では、この包括的な Kotlin の null 安全性ガイド (英語) に従って、null 許容値を持つ関数構造を使用することもできます。
Although Java does not let you express null-safety in its type-system, most Spring projects provide null-safety via JSpecify (英語) annotations.
Kotlin 2.1 以降、Kotlin は org.jspecify.annotations パッケージからの null 可能性アノテーションの厳密な処理を強制します。
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 固有の便利な機能を追加します。
Spring Framework の RestOperations (Javadoc) に対して Spring Framework によって提供されるものと同様の TestRestTemplate (Javadoc) 拡張機能が提供されます。特に、拡張機能により、Kotlin の具体化された型パラメーターを利用できるようになります。
依存関係管理
異なるバージョンの Kotlin 依存関係のクラスパスへの混在を避けるために、Spring Boot は Kotlin BOM をインポートします。
Maven では、kotlin.version プロパティを設定することで Kotlin バージョンをカスタマイズでき、kotlin-maven-plugin のプラグイン管理が提供されます。Gradle を使用すると、Spring Boot プラグインは kotlin.version を Kotlin プラグインのバージョンに自動的に位置合わせします。
Spring Boot は、Kotlin コルーチン BOM をインポートすることにより、コルーチンの依存関係のバージョンも管理します。バージョンは、kotlin-coroutines.version プロパティを設定することでカスタマイズできます。
start.spring.io に少なくとも 1 つのリアクティブ依存関係がある Kotlin プロジェクトをブートストラップする場合、org.jetbrains.kotlinx:kotlinx-coroutines-reactor 依存関係がデフォルトで提供されます。 |
@ConfigurationProperties
@ConfigurationProperties (Javadoc) をコンストラクターバインディングと組み合わせて使用すると、次の例に示すように、不変の 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 との相互運用性の制限により、値クラスのサポートは制限されています。特に、値クラスのデフォルト値に依存すると、構成プロパティのバインディングでは機能しません。このような場合は、代わりにデータクラスを使用する必要があります。
アノテーションプロセッサーを使用して独自のメタデータを生成するには、kapt を spring-boot-configuration-processor 依存関係で構成する必要があります (英語) 。kapt が提供するモデルの制限により、一部の機能 (デフォルト値や非推奨項目の検出など) が機能しないことに注意してください。 |
テスト
Kotlin コードのテストには JUnit 4 を使用することも可能ですが、JUnit 6 がデフォルトで提供されており、こちらを使用することが推奨されます。JUnit 6 では、テストクラスを一度インスタンス化すれば、そのクラスのすべてのテストで再利用できます。これにより、非静的メソッドに @BeforeAll (英語) および @AfterAll (英語) アノテーションを使用できるようになり、これは Kotlin に最適です。
Kotlin クラスをモックするには、MockK (英語) が推奨されます。Mockito 固有の @MockitoBean と @MockitoSpyBean アノテーションに相当する MockK が必要な場合は、同様の @MockkBean および @SpykBean アノテーションを提供する SpringMockK [GitHub] (英語) を使用できます。
リソース
参考文献
Kotlin Slack (英語) (専用の #spring チャンネル)
サンプル
spring-boot-kotlin-demo [GitHub] (英語) : 通常の Spring Boot + Spring Data JPA プロジェクト
mixit [GitHub] (英語) : Spring Boot 2 + WebFlux + リアクティブ Spring Data MongoDB
spring-kotlin-fullstack [GitHub] (英語) : JavaScript または TypeScript の代わりにフロントエンドに Kotlin2js を使用した WebFlux Kotlin フルスタックの例
spring-petclinic-kotlin [GitHub] (英語) : Spring PetClinic サンプルアプリケーションの Kotlin バージョン
spring-kotlin-deepdive [GitHub] (英語) : Boot 1.0 + Java から Boot 2.0 + Kotlin への段階的な移行
spring-boot-coroutines-demo [GitHub] (英語) : コルーチンサンプルプロジェクト