如何注册自定义CacheInterceptor而不是Spring中打包的?

时间:2014-01-17 13:09:52

标签: java spring caching

我们正在开发一个多租户应用程序,我们需要带有自定义键的@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论坛中出现了,但到目前为止还没有答案

1 个答案:

答案 0 :(得分:1)

我们找到了this other stackoverflow question的答案,旨在展示如何替换KeyGenerator。

是关键
<cache:annotation-driven /> 
从xml

,并手动配置注释的拦截器。它就像一个魅力!