Как я могу установить пользовательский KeyGenerator для Spring Cache? - PullRequest
3 голосов
/ 18 июля 2011

Я использую 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 ]

16 голосов
/ 15 ноября 2011

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

На сегодняшний день просто удалите org.springframework.context.support-3.1.0.RC1.jar \ org \ springframework \ cache \config \ spring-cache-3.1.xsd из файла jar, который вы получаете при загрузке Spring, и он отлично работает.

5 голосов
/ 18 июля 2011

Хорошо, я просто нахожу способ сделать это ...

<!-- <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, и она работает :) Готово!

edit:

Для Spring> 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 голосов
/ 17 января 2013

Я столкнулся с проблемой с Cache KeyGenerator по умолчанию Spring Frameworks.Кажется, что часто встречаются конфликты, и, кажется, они были записаны в этой проблеме

Я знаю, что этот вопрос уже помечен как ответный, но я подумал, что поделюсь, как я решил это...

<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 вместо стандартного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...