2011-07-18 69 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

好吧,我只是找到一個方法來做到這一點...

<!-- <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" /> 

正如你所看到的,我用的是AnnotationDrivenCacheBeanDefinitionParser,我把配置在我的XML,它的工作:)完成!

編輯:

春天> 3.2,你可以使用一個簡單的Java類的配置實現CachingConfigurer:

@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一個更好的辦法:

<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) { 
}} 

截至今天,只需從您下載spring時獲得的jar文件中刪除org.springframework.context.support-3.1.0.RC1.jar \ org \ springframework \ cache \ config \ spring-cache-3.1.xsd並它工作正常。

+0

如果使用此配置和實現,並且某個方法具有使用SpEL指定自定義鍵的註釋,那麼將使用哪個?我的猜測是配置的自定義鍵不會被使用(除非MyKeyGenerator被實現爲通過Method參數來讀取註釋參數並考慮到它)。 – Ulrik

0

我遇到了Spring框架默認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來代替默認值。

相關問題