implementations ejemplo cacheevict cacheable cache java spring caching ehcache

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