我们正在开发一个多租户应用程序,我们需要带有自定义键的@Cacheable考虑一个额外的参数tenantId。 Spring Cache允许自定义桶生成器,实现接口org.springframework.cache.interceptor.KeyGenerator
但是当使用密钥定义@Cacheable注释时,缓存框架不使用该生成器(这表示Spring Cache不应该使用KeyGenerator,至少在Spring 3.2中)。这没有考虑多租户应用程序的用例,其中所有密钥都需要考虑tenantId以避免租户之间的密钥冲突。
此问题的解决方案是在任何情况下使用KeyGenerator的自定义版本替换Spring Cache附带的CacheInterceptor。
代码的关键部分是CacheInterceptor的超类,CacheAspectSupport:
/**
* 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并覆盖一些东西。但是,在Spring Cache配置中没有简单的方法来替换拦截器。我们正在使用xml配置
<cache:annotation-driven />
标签
same question不久前在Spring论坛中出现了,但到目前为止还没有答案
答案 0 :(得分:1)
我们找到了this other stackoverflow question的答案,旨在展示如何替换KeyGenerator。
是关键<cache:annotation-driven />
从xml ,并手动配置注释的拦截器。它就像一个魅力!