アノテーションインターフェース EnableCaching
<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 実装が存在する場合、標準のキャッシュアノテーションを管理するために必要なコンポーネントも登録されます。これにより、CacheResult
、CachePut
、CacheRemove
または 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
は追加のカスタマイズオプションを提供します。すべてをカスタマイズする必要がない場合に役立つすべてのメソッドのデフォルト実装を提供する CachingConfigurerSupport
から拡張することをお勧めします。詳細については、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 modeキャッシングアドバイスの適用方法を示します。デフォルトは
AdviceMode.PROXY
です。プロキシモードでは、プロキシを介したコールの代行受信のみが可能であることに注意してください。同じクラス内のローカル呼び出しは、そのようにインターセプトされることはありません。Spring のインターセプターはそのようなランタイムシナリオを実行しないため、ローカル呼び出し内のそのようなメソッドのキャッシュアノテーションは無視されます。より高度な遮断モードについては、これをAdviceMode.ASPECTJ
に切り替えることを検討してください。- デフォルト:
- PROXY
order
int order特定のジョインポイントで複数のアドバイスが適用される場合のキャッシングアドバイザーの実行順序を示します。デフォルトは
Ordered.LOWEST_PRECEDENCE
です。- デフォルト:
- 2147483647