Java 如何注册自定义CacheInterceptor而不是Spring中打包的CacheInterceptor?
我们正在处理一个多租户应用程序,我们需要@Cacheable with custom key考虑一个额外的参数,tenantId。SpringCache允许定制keg生成器,实现接口org.springframework.Cache.interceptor.KeyGenerator 但是,当@Cacheable注释使用键定义时,缓存框架不使用该生成器(这表明Spring缓存不应使用KeyGenerator,至少在Spring 3.2中是这样)。这不考虑多租户应用程序的用例,其中所有密钥都需要考虑租户,以避免租户之间的密钥冲突 这个问题的一个解决方案是将SpringCache附带的CacheInterceptor替换为在任何情况下都使用KeyGenerator的自定义版本 代码的关键部分在CacheInterceptor的超类CacheApectSupport中:Java 如何注册自定义CacheInterceptor而不是Spring中打包的CacheInterceptor?,java,spring,caching,Java,Spring,Caching,我们正在处理一个多租户应用程序,我们需要@Cacheable with custom key考虑一个额外的参数,tenantId。SpringCache允许定制keg生成器,实现接口org.springframework.Cache.interceptor.KeyGenerator 但是,当@Cacheable注释使用键定义时,缓存框架不使用该生成器(这表明Spring缓存不应使用KeyGenerator,至少在Spring 3.2中是这样)。这不考虑多租户应用程序的用例,其中所有密钥都需要考虑
/**
* Computes the key for the given caching operation.
* @return generated key (null if none can be generated)
*/
protected Object generateKey() {
if (StringUtils.hasText(this.operation.getKey())) {
return evaluator.key(this.operation.getKey(), this.method, this.evalContext);
}
return keyGenerator.generate(this.target, this.method, this.args);
}
我们处理一种将代码替换为一个版本的方法,该版本考虑独立于代码值的生成
this.operation.getKey()
通过将CacheInterceptor子类化并重写几件事情。然而,在SpringCache配置中没有简单的方法来替换拦截器。我们将xml配置用于
<cache:annotation-driven />
标签
一段时间前,Spring论坛上出现了这个问题,但到目前为止还没有答案我们找到了一个旨在说明如何更换KeyGenerator的答案。关键是要注释掉这个问题
<cache:annotation-driven />
并手动配置注释的拦截器。它就像一个符咒 如何自定义
generateKey
或自定义拦截器?