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

좋아, 난 그냥 당신이 볼 수 있듯이, 나는 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

, 당신은 간단한 자바 클래스 구성 구현 CachingConfigurer을 사용할 수 있습니다 오늘 봄에 org.springframework.context.support-3.1.0.RC1.jar \ org \ springframework \ cache \ config \ spring-cache-3.1.xsd 파일을 jar 파일에서 삭제하면됩니다. 그것은 잘 작동합니다.

+0

이 구성 및 구현이 사용되고 특정 메서드에 SpEL을 사용하는 사용자 지정 키를 지정하는 주석이있는 경우 사용됩니까? 내 생각 엔 구성된 사용자 지정 키는 사용되지 않습니다 (MyKeyGenerator가 구현되어 Method 매개 변수를 통해 annotation-parameter를 읽고 고려하지 않는 한). – Ulrik

0

스프링 프레임 워크의 기본 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를 만들어서 기본 캐시 대신 사용했습니다.

관련 문제