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


Spring の <cache:*> XML 名前空間にあるサポートと同様に、Spring のアノテーション駆動型キャッシュ管理機能を有効にします。次のように @Configuration クラスと一緒に使用します。
 @Configuration
 @EnableCaching
 public class AppConfig {

     @Bean
     public MyService myService() {
         // configure and return a class having @Cacheable methods
         return new MyService();
     }

     @Bean
     public CacheManager cacheManager() {
         // configure and return an implementation of Spring's CacheManager SPI
         SimpleCacheManager cacheManager = new SimpleCacheManager();
         cacheManager.setCaches(Set.of(new ConcurrentMapCache("default")));
         return cacheManager;
     }
 }

参考のために、上記の例を次の Spring XML 構成と比較できます。

 <beans>

     <cache:annotation-driven/>

     <bean id="myService" class="com.foo.MyService"/>

     <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
         <property name="caches">
             <set>
                 <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean">
                     <property name="name" value="default"/>
                 </bean>
             </set>
         </property>
     </bean>

 </beans>
 
上記の両方のシナリオで、@EnableCaching と  <cache:annotation-driven/> は、CacheInterceptor や、@Cacheable メソッドの際にインターセプターをコールスタックに組み込むプロキシまたは AspectJ ベースのアドバイスなど、アノテーション駆動型のキャッシュ管理に必要な Spring コンポーネントの登録を担当します。呼び出されます。

JSR-107 API と Spring の JCache 実装が存在する場合、標準のキャッシュアノテーションを管理するために必要なコンポーネントも登録されます。これにより、CacheResultCachePutCacheRemove または CacheRemoveAll でアノテーションが付けられたメソッドが呼び出されたときにインターセプターがコールスタックに組み込まれるプロキシまたは AspectJ ベースのアドバイスが作成されます。

フレームワークが規則として使用できる妥当なデフォルトがないため、CacheManager の Bean を登録する必要があります。また、<cache:annotation-driven> 要素は "cacheManager" という名前の Bean を想定していますが、@EnableCaching  は型によってキャッシュマネージャー Bean を検索します。キャッシュマネージャー Bean メソッドの名前は重要ではありません。

@EnableCaching と使用する正確なキャッシュマネージャー Bean との間のより直接的な関連を確立したい場合は、CachingConfigurer コールバックインターフェースを実装できます。以下の @Override アノテーション付きメソッドに注意してください。

 @Configuration
 @EnableCaching
 public class AppConfig implements CachingConfigurer {

     @Bean
     public MyService myService() {
         // configure and return a class having @Cacheable methods
         return new MyService();
     }

     @Bean
     @Override
     public CacheManager cacheManager() {
         // configure and return an implementation of Spring's CacheManager SPI
         SimpleCacheManager cacheManager = new SimpleCacheManager();
         cacheManager.setCaches(Set.of(new ConcurrentMapCache("default")));
         return cacheManager;
     }

     @Bean
     @Override
     public KeyGenerator keyGenerator() {
         // configure and return an implementation of Spring's KeyGenerator SPI
         return new MyKeyGenerator();
     }
 }
このアプローチは、より明示的であるという理由だけで望ましい場合があります。または、同じコンテナーに存在する 2 つの CacheManager Bean を区別するために必要な場合があります。

上記の例の keyGenerator メソッドにも注目してください。これにより、Spring の KeyGenerator SPI ごとに、キャッシュキー生成の戦略をカスタマイズできます。通常、@EnableCaching はこの目的のために Spring の SimpleKeyGenerator を構成しますが、CachingConfigurer を実装する場合、キージェネレーターを明示的に提供する必要があります。カスタマイズが必要ない場合は、このメソッドから null または new SimpleKeyGenerator() を返します。

CachingConfigurer は追加のカスタマイズオプションを提供します。詳細については、CachingConfigurer javadoc を参照してください。

mode() 属性は、アドバイスの適用方法を制御します。モードが AdviceMode.PROXY(デフォルト)の場合、他の属性がプロキシの動作を制御します。プロキシモードでは、プロキシを介した呼び出しのみのインターセプトが許可されることに注意してください。同じクラス内のローカル呼び出しは、そのようにインターセプトすることはできません。

mode()AdviceMode.ASPECTJ に設定されている場合、proxyTargetClass() 属性の値は無視されることに注意してください。また、この場合、影響を受けるクラスにアスペクトを適用するコンパイル時ウィービングまたはロード時ウィービングを使用して、spring-aspects モジュール JAR がクラスパスに存在する必要があることに注意してください。このようなシナリオに関係するプロキシはありません。ローカルコールもインターセプトされます。

導入:
3.1
作成者:
Chris Beams, Juergen Hoeller
関連事項:
  • オプション要素のサマリー

    オプション要素
    修飾子と型
    オプションの要素
    説明
    キャッシングアドバイスの適用方法を示します。
    int
    特定のジョインポイントで複数のアドバイスが適用される場合のキャッシングアドバイザーの実行順序を示します。
    boolean
    標準の Java インターフェースベースのプロキシではなく、サブクラスベース(CGLIB)のプロキシを作成するかどうかを示します。
  • 要素の詳細

    • proxyTargetClass

      boolean proxyTargetClass
      標準の Java インターフェースベースのプロキシではなく、サブクラスベース(CGLIB)のプロキシを作成するかどうかを指定します。デフォルトは false です。 mode() の場合のみ適用AdviceMode.PROXY に設定されます。

      この属性を true に設定すると、@Cacheable でマークされたものだけでなく、プロキシを必要とするすべての Spring 管理 Bean に影響することに注意してください。例: Spring の @Transactional アノテーションでマークされた他の Bean は、同時にサブクラスプロキシにアップグレードされます。このアプローチは、テストなどで、ある型のプロキシと別の型のプロキシを明示的に期待しない限り、実際にはマイナスの影響はありません。

      デフォルト:
      false
    • mode

      キャッシングアドバイスの適用方法を示します。

      デフォルトは AdviceMode.PROXY です。プロキシモードでは、プロキシを介したコールの代行受信のみが可能であることに注意してください。同じクラス内のローカル呼び出しは、そのようにインターセプトされることはありません。Spring のインターセプターはそのようなランタイムシナリオを実行しないため、ローカル呼び出し内のそのようなメソッドのキャッシュアノテーションは無視されます。より高度な遮断モードについては、これを AdviceMode.ASPECTJ に切り替えることを検討してください。

      デフォルト:
      PROXY
    • order

      int order
      特定のジョインポイントで複数のアドバイスが適用される場合のキャッシングアドバイザーの実行順序を示します。

      デフォルトは Ordered.LOWEST_PRECEDENCE です。

      デフォルト:
      2147483647