java - ejemplo - ¿Cómo puedo establecer un KeyGenerator personalizado para Spring Cache?
spring cache redis (3)
Encontré un problema con Cache KeyGenerator predeterminado de Spring Frameworks. Parece que a menudo encuentra conflictos y parece que se ha registrado en este tema
Sé que esta pregunta ya ha sido marcada como respondida, pero pensé que compartiría cómo resolví esto ...
<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" />
Básicamente, creamos y usamos nuestro propio Cache KeyGenerator en lugar del predeterminado.
Estoy usando Spring 3.1 y quiero usar las nuevas funciones de caché. Entonces, lo intenté:
<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" />
Pero no encontré la manera de configurar mi KeyGenerator personalizado. ¿Alguna idea?
Hay una mejor manera en 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) {
}}
A partir de hoy, solo elimine org.springframework.context.support-3.1.0.RC1.jar / org / springframework / cache / config / spring-cache-3.1.xsd del archivo jar que obtiene cuando descarga la primavera y funciona multa.
Ok, solo encuentro una manera de hacer esto ...
<!-- <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" />
Como puede ver, utilizo AnnotationDrivenCacheBeanDefinitionParser, puse la configuración en mi xml y funciona :) ¡Hecho!
editar:
Para Spring> 3.2, puede usar una configuración simple de clase Java implementando CachingConfigurer:
@EnableCaching(mode = AdviceMode.ASPECTJ)
public class CacheConfig implements CachingConfigurer {
public KeyGenerator keyGenerator() {
return new ReflectionBasedKeyGenerator();
}
public CacheManager cacheManager() {
return new RedisCacheManager(redisCacheTemplate);
}
}