2011-07-18 9 views
3

私はSpring 3.1を使用しており、新しいキャッシュ機能を使用したいと思います。次に、私は試しました:Spring CacheのカスタムKeyGeneratorを設定するにはどうすればよいですか?

<cache:annotation-driven /> 

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" 
    p:cache-manager-ref="ehcache" /> 

<!-- Ehcache library setup --> 
<bean id="ehcache" 
    class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" 
    p:config-location="classpath:ehcache.xml" /> 

しかし、私は私のカスタムKeyGeneratorを設定する方法を見つけることができませんでした。何か案が?

答えて

5

OK]をクリックして、私はちょうどあなたが見ることができるように、私はAnnotationDrivenCacheBeanDefinitionParserを使用

<!-- <cache:annotation-driven /> --> 

<bean id="annotationCacheOperationSource" 
    class="org.springframework.cache.annotation.AnnotationCacheOperationSource" /> 

<bean id="cacheInterceptor" class="org.springframework.cache.interceptor.CacheInterceptor" 
    p:cacheDefinitionSources-ref="annotationCacheOperationSource" 
    p:cacheManager-ref="cacheManager" p:keyGenerator-ref="keyGenerator" /> 

<bean id="beanFactoryCacheOperationSourceAdvisor" 
    class="org.springframework.cache.interceptor.BeanFactoryCacheOperationSourceAdvisor" 
    p:adviceBeanName="cacheInterceptor" p:cacheDefinitionSource-ref="annotationCacheOperationSource" /> 

<bean id="keyGenerator" 
    class="my.company.cache.ReflectionBasedKeyGenerator" /> 

...これを行うための方法を見つける、私は私のxmlに設定を入れて、それが動作します:)完了!

編集:

<cache:annotation-driven key-generator="myKeyGenerator"/> 
<bean id="myKeyGenerator" class="com.abc.MyKeyGenerator" /> 

import org.springframework.cache.interceptor.KeyGenerator; 
public class MyKeyGenerator implements KeyGenerator { 

    public Object generate(Object target, Method method, Object... params) { 
}} 

@EnableCaching(mode = AdviceMode.ASPECTJ) 
public class CacheConfig implements CachingConfigurer { 

    public KeyGenerator keyGenerator() { 
     return new ReflectionBasedKeyGenerator(); 
    } 

    public CacheManager cacheManager() { 
     return new RedisCacheManager(redisCacheTemplate); 
    } 
} 
+0

このソリューションは、3.2.3の春には機能しません。誰かが答えを更新できますか? – Anuruddha

14

春3.1 RC1でのより良い方法があります:春> 3.2の場合

、あなたは、単純なJavaクラスコンフィギュレーションの実装CachingConfigurerを使用することができます今日の時点では、SpringとSpringをダウンロードするときに取得するjarファイルからorg.springframework.context.support-3.1.0.RC1.jar \ org \ springframework \ cache \ config \ spring-cache-3.1.xsdを削除するだけです。それはうまく動作します。

+0

この設定と実装が使用されていて、特定のメソッドに、SpELを使用してカスタムキーを指定する注釈がある場合、その注釈は使用されますか?私の推測では、設定されたカスタムキーは使用されません(MyKeyGeneratorが実装されていない限り、Method引数でannotation-parameterを読み込んで考慮する必要はありません)。 – Ulrik

0

Spring FrameworkのデフォルトのCache KeyGeneratorに問題が発生しました。 ...多くの場合、競合が発生しているようだ、私が答えたように、この質問はすでにマークされている知っているこのissue

に記録されているように見えますが、私はこれを解決する方法を私は共有するだろうと思っ

<cache:annotation-driven cache-manager="cacheManager" key-generator="entityKeyGenerator" /> 

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> 
    <property name="cacheManager" ref="ehcache" /> 
</bean> 

<bean id="ehcache" 
    class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" 
    p:configLocation="classpath:/ehcache-dciComponent.xml" p:shared="true" /> 

基本的には、デフォルトのキャッシュキー生成ツールの代わりに独自のCache KeyGeneratorを作成して使用しました。

関連する問題