Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何注册自定义CacheInterceptor而不是Spring中打包的CacheInterceptor?_Java_Spring_Caching - Fatal编程技术网

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

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中是这样)。这不考虑多租户应用程序的用例,其中所有密钥都需要考虑

我们正在处理一个多租户应用程序,我们需要@Cacheable with custom key考虑一个额外的参数,tenantId。SpringCache允许定制keg生成器,实现接口org.springframework.Cache.interceptor.KeyGenerator

但是,当@Cacheable注释使用键定义时,缓存框架不使用该生成器(这表明Spring缓存不应使用KeyGenerator,至少在Spring 3.2中是这样)。这不考虑多租户应用程序的用例,其中所有密钥都需要考虑租户,以避免租户之间的密钥冲突

这个问题的一个解决方案是将SpringCache附带的CacheInterceptor替换为在任何情况下都使用KeyGenerator的自定义版本

代码的关键部分在CacheInterceptor的超类CacheApectSupport中:

/**
* 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
或自定义拦截器?