如何为Spring Cache设置自定义KeyGenerator?

时间:2011-07-18 09:03:03

标签: java spring caching ehcache

我正在使用Spring 3.1,我想使用新的缓存功能。然后,我试过了:

<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的方法。有什么想法吗?

3 个答案:

答案 0 :(得分:16)

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

截至今天,只需从下载弹簧时获取的jar文件中删除org.springframework.context.support-3.1.0.RC1.jar \ org \ springframework \ cache \ config \ spring-cache-3.1.xsd它工作正常。

答案 1 :(得分: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中,它可以工作:)完成!

编辑:

对于春天&gt; 3.2,您可以使用实现CachingConfigurer的简单Java类配置:

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

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

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

答案 2 :(得分:0)

我遇到了Spring Frameworks默认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来代替默认的。