アノテーションインターフェース Cacheable


メソッド(またはクラス内のすべてのメソッド)を呼び出した結果をキャッシュできることを示すアノテーション。

推奨メソッドが呼び出されるたびに、キャッシュ動作が適用され、指定された引数に対してメソッドがすでに呼び出されているかどうかがチェックされます。実用的なデフォルトでは、単にメソッドパラメーターを使用してキーを計算しますが、key() 属性を介して SpEL 式を提供するか、デフォルトの KeyGenerator 実装を置き換えることができます(keyGenerator() を参照)。

計算されたキーの値がキャッシュに見つからない場合、ターゲットメソッドが呼び出され、戻り値が関連するキャッシュに保存されます。OptionalSE 戻り値の型は自動的にアンラップされることに注意してください。Optional 値が存在する場合、関連するキャッシュに保存されます。Optional 値が存在しない場合、null は関連するキャッシュに保存されます。

このアノテーションをメタアノテーションとして使用して、属性をオーバーライドしたカスタム合成アノテーションを作成できます。

導入:
3.1
作成者:
Costin Leau, Phillip Webb, Stephane Nicoll, Sam Brannen
関連事項:
  • オプション要素のサマリー

    オプション要素
    修飾子と型
    オプションの要素
    説明
    デフォルト CacheResolver がまだ設定されていない場合に作成するために使用するカスタム CacheManager の Bean 名。
    メソッド呼び出しの結果が保存されるキャッシュの名前。
    使用するカスタム CacheResolver の Bean 名。
    メソッドキャッシュを条件付きにするために使用される Spring Expression Language(SpEL)式。
    キーを動的に計算するための Spring Expression Language(SpEL)式。
    使用するカスタム KeyGenerator の Bean 名。
    boolean
    複数のスレッドが同じキーの値をロードしようとしている場合は、基になるメソッドの呼び出しを同期します。
    メソッドのキャッシュを拒否するために使用される Spring 式言語(SpEL)式。
    cacheNames() のエイリアス。
  • 要素の詳細

    • value

      @AliasFor("cacheNames") StringSE[] value
      cacheNames() のエイリアス。
      デフォルト:
      {}
    • cacheNames

      @AliasFor("value") StringSE[] cacheNames
      メソッド呼び出しの結果が保存されるキャッシュの名前。

      名前はターゲットキャッシュを決定するために使用され、通常は CacheManager.getCache(java.lang.String) に委譲される構成された cacheResolver() を介して解決されます。

      通常、これは単一のキャッシュ名になります。複数の名前が指定されている場合、定義の順序でキャッシュヒットについて参照され、すべての名前が新しくキャッシュされた同じ値に対する put/evict リクエストを受け取ります。

      非同期 / リアクティブキャッシュアクセスでは、ターゲットキャッシュによっては、指定されたすべてのキャッシュを完全に参照できない場合があることに注意してください。後で決定されたキャッシュミス (Redis など) の場合、それ以降のキャッシュは参照されなくなります。結果として、非同期キャッシュモード設定で複数のキャッシュ名を指定することは、早期に決定されたキャッシュミス (Caffeine など) の場合にのみ意味を持ちます。

      導入:
      4.2
      関連事項:
      デフォルト:
      {}
    • key

      キーを動的に計算するための Spring Expression Language(SpEL)式。

      デフォルトは "" です。つまり、カスタム keyGenerator() が構成されていない限り、すべてのメソッドパラメーターがキーと見なされます。

      SpEL 式は、次のメタデータを提供する専用のコンテキストに対して評価します。

      • それぞれ methodSE、ターゲットオブジェクト、影響を受けるキャッシュへの参照用の #root.method#root.target#root.caches
      • メソッド名(#root.methodName)およびターゲットクラス(#root.targetClass)のショートカットも利用できます。
      • メソッドの引数はインデックスでアクセスできます。たとえば、2 番目の引数は #root.args[1]#p1#a1 を介してアクセスできます。その情報が利用可能な場合、引数は名前でアクセスすることもできます。
      デフォルト:
      ""
    • keyGenerator

      StringSE keyGenerator
      使用するカスタム KeyGenerator の Bean 名。

      key() 属性と相互に排他的です。

      関連事項:
      デフォルト:
      ""
    • cacheManager

      StringSE cacheManager
      デフォルト CacheResolver がまだ設定されていない場合に作成するために使用するカスタム CacheManager の Bean 名。

      cacheResolver() 属性と相互に排他的です。

      関連事項:
      デフォルト:
      ""
    • cacheResolver

      StringSE cacheResolver
      使用するカスタム CacheResolver の Bean 名。
      関連事項:
      デフォルト:
      ""
    • condition

      StringSE condition
      Spring メソッドのキャッシュを条件付きにするために使用される式言語 (SpEL) 式。条件が true と評価された場合、結果をキャッシュします。

      デフォルトは "" です。つまり、メソッドの結果は常にキャッシュされます。

      SpEL 式は、次のメタデータを提供する専用のコンテキストに対して評価します。

      • それぞれ methodSE、ターゲットオブジェクト、影響を受けるキャッシュへの参照用の #root.method#root.target#root.caches
      • メソッド名(#root.methodName)およびターゲットクラス(#root.targetClass)のショートカットも利用できます。
      • メソッドの引数はインデックスでアクセスできます。たとえば、2 番目の引数は #root.args[1]#p1#a1 を介してアクセスできます。その情報が利用可能な場合、引数は名前でアクセスすることもできます。
      デフォルト:
      ""
    • unless

      StringSE unless
      Spring メソッドのキャッシュを拒否するために使用される式言語 (SpEL) 式。条件が true と評価された場合、結果のキャッシュを拒否します。

      condition() とは異なり、この式はメソッドが呼び出された後に評価されるため、result を参照できます。

      デフォルトは "" です。つまり、キャッシュが拒否されることはありません。

      SpEL 式は、次のメタデータを提供する専用のコンテキストに対して評価します。

      • メソッド呼び出しの結果への参照については、#resultOptional などのサポートされているラッパーの場合、#result はラッパーではなく実際のオブジェクトを参照します
      • それぞれ methodSE、ターゲットオブジェクト、影響を受けるキャッシュへの参照用の #root.method#root.target#root.caches
      • メソッド名(#root.methodName)およびターゲットクラス(#root.targetClass)のショートカットも利用できます。
      • メソッドの引数はインデックスでアクセスできます。たとえば、2 番目の引数は #root.args[1]#p1#a1 を介してアクセスできます。その情報が利用可能な場合、引数は名前でアクセスすることもできます。
      導入:
      3.2
      デフォルト:
      ""
    • sync

      boolean sync
      複数のスレッドが同じキーの値をロードしようとしている場合は、基になるメソッドの呼び出しを同期します。同期にはいくつかの制限があります。
      1. unless() はサポートされていません
      2. 指定できるキャッシュは 1 つだけです
      3. 他のキャッシュ関連の操作は組み合わせることができません
      これは事実上ヒントであり、選択したキャッシュプロバイダーが実際には同期された方法でサポートしていない可能性があります。実際のセマンティクスの詳細については、プロバイダーのドキュメントを確認してください。
      導入:
      4.3
      関連事項:
      デフォルト:
      false