このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Data Commons 3.5.5 を使用してください!

事前の最適化

この章では、Spring の事前最適化を基盤とした Spring Data の Ahead of Time (AOT) 最適化について説明します。

ベストプラクティス

ドメイン型にアノテーションを付ける

アプリケーションの起動時に、Spring はエンティティの初期処理のためにクラスパスをスキャンし、ドメインクラスを探します。ドメイン型に Spring Data ストア固有の @Table@Document@Entity アノテーションを付与することで、初期のエンティティスキャンを容易にし、それらの型がランタイムヒントの ManagedTypes に登録されるようにすることができます。ネイティブイメージ配置ではクラスパススキャンが不可能なため、Spring は初期エンティティセットに ManagedTypes を使用する必要があります。

事前コード生成

事前コード生成は、GraalVM Native Image での使用に限定されず、通常の デプロイで作業する場合にも利点があり、JVM での起動パフォーマンスの最適化に役立ちます。

Ahead of Time コンパイルが有効になっている場合、Spring Data は (実際に使用されているモジュールに応じて) ビルドの AOT フェーズ中にいくつかのコンポーネントを提供できます。

  • 生成された型 / プロパティアクセサーのバイトコード

  • 定義されたリポジトリインターフェースのソースコード

  • JSON 形式のリポジトリメタデータ

上記の各機能はデフォルトで有効になっています。ただし、ユーザーは以下のオプションを使用して設定を微調整できます。

spring.aot.data.accessors.enabled

生成された型 / プロパティアクセサーのバイトコードのコントリビュートを制御するブールフラグ

spring.aot.data.accessors.include

生成された型 / プロパティアクセサーのバイトコードを提供する FQCN のカンマ区切りリスト。パッケージ名(例: com.acme.**)または型名の包含に一致する Ant スタイルの包含パターン。包含パターンの一致は、広範囲の除外と選択的な包含の除外の前に評価されます。

spring.aot.data.accessors.exclude

生成された型 / プロパティアクセサーのバイトコード提供をスキップする FQCN のカンマ区切りリスト。パッケージ名(例: com.acme.**)または型名の除外に一致する Ant スタイルの除外パターン。除外パターンの一致は、広範囲の除外と選択的な包含の包含の後に評価されます。

spring.aot.repositories.enabled

リポジトリインターフェースのソースコードのコントリビュートを制御するブールフラグ

spring.aot.[module-name].repositories.enabled

特定のモジュールのリポジトリインターフェースのソースコードのコントリビュートを制御するブールフラグ (例: jdbcjpamongodbcassandra)

事前リポジトリ

AOT リポジトリは、適切なクエリメソッド実装を事前に生成することで AOT 処理を拡張するものです。クエリメソッドは、その呼び出しで実行されるクエリについて開発者には不透明です。AOT リポジトリは、ビルド時に既知の派生クエリ、アノテーション付きクエリ、名前付きクエリに基づいて、クエリメソッド実装を提供します。この最適化により、クエリメソッド処理が実行時からビルド時へと移行されます。これにより、アプリケーションの起動時にクエリメソッドをリフレクション的に分析する必要がなくなり、パフォーマンスが大幅に向上します。

結果として得られる AOT リポジトリフラグメントは、<Repository FQCN>Impl_AotRepository の命名スキームに従い、リポジトリインターフェースと同じパッケージに配置されます。

ネイティブイメージランタイムのヒント

アプリケーションをネイティブイメージとして実行するには、通常の JVM ランタイムに比べて追加の情報が必要です。Spring Data は、ネイティブイメージの使用に関する AOT 処理中に実行時のヒントを提供します。これらは特に、以下の点に関するヒントです。

  • 監査

  • クラスパススキャンの結果をキャプチャーするための ManagedTypes 

  • リポジトリ

    • エンティティ、戻り値の型、Spring Data アノテーションのリフレクションヒント

    • リポジトリフラグメント

    • Querydsl Q クラス

    • Kotlin コルーチンサポート

  • Web サポート (Jackson の PagedModel のヒント)