前提知識:
- Spring Cache キャッシュには、CacheManager と Cache という 2 つの主要なコンポーネントがあります. キャッシュ全体に複数の CacheManagers が存在する可能性があり、それらは内部のキャッシュを管理する責任があります. 1 つの CacheManager で複数のキャッシュを作成することができ、各キャッシュは特定の種類のデータの格納を担当します。たとえば、給与キャッシュは給与関連のデータの格納を担当します。
ステップ:
1. 注釈ベースのキャッシュを有効にする
@EnabeleCaching アノテーションをスタートアップ クラスまたはその他の構成クラスに追加します。
@SpringBootApplication @MapperScan("com.xj.springboot.mapper") @EnableCaching public class SpringbootCacheApplication { public static void main(String[] args) { SpringApplication.run(SpringbootCacheApplication.class, args); } }
2. メソッドのキャッシュ アノテーションをマークします。
1.@キャッシュ可能
このアノテーションはメソッドでマークできます。@Cacheable アノテーションでマークされたメソッドが初めて呼び出されると、アノテーションはメソッドの戻り値を値としてキャッシュに保存します。キーが指定されていない場合、デフォルトのキーの値は、メソッド. パラメータの実際の値です(これは正式なパラメータではないことに注意してください)。次に、このメソッドを再度呼び出します。渡されたパラメーターは前回と同じで、メソッド本体のコードは実行されませんが、データはキャッシュから直接フェッチされて返されます。
キャッシュ可能なアノテーションには、value、cacheNames、key、keyGenerator、cacheManager、cacheResolver、condition、unless、sync の 9 つの属性があります。このうち、value と cacheNames はお互いの別名であるため、属性は 8 つしかないと言えます。
- value / cacheNames: キャッシュの名前を指定するために使用されます。このプロパティは配列型で、複数のキャッシュの名前を指定できます。この属性は指定する必要があり、設定されていない場合はエラーが報告されます。
- key: キャッシュに格納されたデータのキーを指定するために使用されます (現在のメソッドの戻り値はキー値の形式でキャッシュに格納される必要があるため)。設定されていない場合、デフォルトは実際の値です。着信メソッドのパラメーター (フォーム参照ではないことに注意してください) を設定する場合は、通常、spEL 式を使用します (spEL は下の図を参照できます)。
注: @Cacheable アノテーションの key 属性で #result を使用して、メソッドの実行後に戻り値を取得することはできません。これは、@Cacheable アノテーションが最初にキャッシュ内で検索されるためです。メソッドが実行される前の値。
- keyGenerator: キーの指定に使用されるジェネレータ。keyGenerator と key が同時に存在できるのは 1 つだけであることに注意してください. key が設定されると、keyGenerator を再度設定することはできません.
- cacheManager: 使用する CacheManager (キャッシュ マネージャー) を指定します。springboot の自動構成により、コンテナーに ConcurrentMapCacheManager タイプの cacheManager が追加されます. cacheManager を指定しない場合、デフォルトで springboot によって提供される ConcurrentMapCacheManager が使用されます.
- cacheResolver: cacheManager と同じ。
- 条件: 式を指定するために使用されます。式が true の場合、メソッドの戻り値がキャッシュに入れられます。通常、式は spEL 式のように記述します。
- not: 条件属性とは反対の効果があります。式を指定します。式が true の場合、メソッドの戻り値はキャッシュに入れられません。condition との違いの 1 つは、unless の式では、メソッドの戻り値を取得して判断できることです。
- sync: 非同期モードを使用するかどうか。このアノテーションを true に設定する (つまり、非同期モードを有効にする) 場合、unless 属性は使用できません。このプロパティは、複数のスレッドが同時に実行されている場合に有効にできます。
実行プロセスの概要:
メソッドを呼び出す前に、まず注釈の cacheNames 属性で指定された名前を取得して、キャッシュ内にその名前のキャッシュがあるかどうかを確認します. 存在する場合は、キーが実際のパラメーターであるデータを直接返しますメソッド。そうでない場合は、cacheNames 属性で指定された名前でキャッシュを作成し、メソッド本体を実行して、メソッドの戻り結果を値としてキャッシュに入れます。
2.@キャッシュプット
このアノテーションはメソッドに付けることができ、 @Cacheput アノテーションで付けられたメソッドが毎回呼び出されると、アノテーションはメソッドの戻り値を value としてキャッシュに格納します。通常、データベースの更新操作を実行するメソッドでマークされます。
CachePut アノテーションと Cacheable アノテーションの違い: Cacheable は、メソッドが最初に呼び出されたときにのみメソッドの戻り値をキャッシュに入れ、再度呼び出されたときにメソッド本体がキャッシュにある場合は実行されません。また、CachePut は、メソッドを呼び出すたびにメソッドの戻り値をキャッシュに入れます。
cachePut アノテーションには、Cacheable アノテーションの属性と同じ 9 つの属性があります。
3.CacheEvict
cacheevict の Evict は、追放、立ち退きを意味します。したがって、このアノテーションは、キャッシュ内の指定されたキーのデータを削除するために使用されます。このアノテーションはメソッドでマークできます. @CacheEvict アノテーションでマークされたメソッドが呼び出されると, アノテーションは Cacheevict アノテーションの key 属性で指定されたキーに従ってキャッシュ内のキーに対応する値を見つけます.消して。
Cacheevict アノテーションには、value、cacheNames、key、keyGenerator、cacheManager、cacheResolver、condition、allEntries、beforeInvocation の 9 つの属性があります。このうち、最初の 7 つの属性は @Cacheable の属性と同じなので、以下では詳しく説明せず、allEntries と beforeInvocation のみを紹介します。
- allEntries: allEntries が true に設定されている場合、現在のアノテーションでマークされたメソッドを呼び出すと、 cacheNames で指定されたキャッシュ内のすべてのキャッシュ データが消去されます。デフォルトは false
- beforeInvocation: beforeInvocation が true に設定されている場合、キャッシュされたデータをクリアするアクションは、メソッドが呼び出される前に実行されます。デフォルト値は false です。つまり、メソッドが最初に呼び出され、メソッド内のコンテンツが実行され、最後にキャッシュされたデータをクリアするアクションが実行されます。beforeInvocation の用途とは何か、メソッド呼び出し前とメソッド呼び出し後のキャッシュ データをクリアするアクションの違いは何なのか、まだ疑問に思っているかもしれません。答えは明らかに違います.違いは,メソッドが呼び出された後にキャッシュされたデータをクリアするアクションが実行される場合,メソッドが最初に実行されることです.このときメソッドで例外が発生した場合,キャッシュされたデータをクリアするアクションが実行されます.データは再実行されません。キャッシュデータをクリアするアクションは、メソッドが呼び出される前に行われるため、キャッシュデータをクリアするアクションは、メソッドが異常になるかどうかに関係なく実行されます。
4.@キャッシング
このアノテーションの先頭は、Cacheable、CachePut、および CacheEvict の 3 つのアノテーションの組み合わせです。このアノテーションは、複雑なメソッドをキャッシュするのに適しています。以下は、Caching アノテーションのソース コードです。
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Caching { Cacheable[] cacheable() default {}; CachePut[] put() デフォルト {}; CacheEvict[] evict() デフォルト {}; }
5.@CacheConfig
このアノテーションをクラスでマークして、キャッシュのパブリック構成を抽出できます。
クラス内のすべてのメソッドの Cacheable、CachePut、および CacheEvict の 3 つのアノテーションがすべて、同一または同一のキャッシュのバッチを指す cacheNames を持っている場合、@CacheConfig を使用してこれらの cacheNames にアノテーションを付けてから、クラスでこのアノテーションをマークします。 . 次に、このクラスのキャッシュ関連メソッドに cacheNames 属性を指定する必要はなく、CacheConfig で指定された cacheNames が使用されます。