【问题标题】:spring cache key generator why not use spel key?spring cache key generator 为什么不使用 spel key?
【发布时间】:2017-09-13 09:53:42
【问题描述】:

keyGenerator 不适用于 spel 键,我可以为所有包含 @Cacheable(key="#spelKey") 的键自定义 keyGenerator

我找到了代码:org.springframework.cache.interceptor.CacheAspectSupport

    protected Object generateKey(Object result) {
        if (StringUtils.hasText(this.metadata.operation.getKey())) {
            EvaluationContext evaluationContext = this.createEvaluationContext(result);
            return CacheAspectSupport.this.evaluator.key(this.metadata.operation.getKey(), this.methodCacheKey, evaluationContext);
        } else {
            return this.metadata.keyGenerator.generate(this.target, this.metadata.method, this.args);
        }
    }

修改代码如下:

    protected Object generateKey(Object result) {
        if (StringUtils.hasText(this.metadata.operation.getKey())) {
            EvaluationContext evaluationContext = createEvaluationContext(result);
            return this.metadata.keyGenerator.generate(this.target, this.metadata.method, evaluator.key(this.metadata.operation.getKey(), this.methodCacheKey, evaluationContext));
        }
        return this.metadata.keyGenerator.generate(this.target, this.metadata.method, this.args);
    }

【问题讨论】:

  • 我不明白你的问题的本质是什么,但是有一些文档如何指定具有各种粒度的键。 docs.spring.io/spring/docs/current/spring-framework-reference/…
  • @JensSchauder 是的,但我想将目标和方法写入密钥,如 key=[target,method,params].tojson(),现在自定义密钥生成器不使用 @cacheable(key=#拼写)

标签: spring spring-boot spring-cache


【解决方案1】:

我不确定你想用#spelKey 做什么,但它已被记录在案。如果你想做一些复杂的事情,我会实现一个KeyGenerator,见the documentation

【讨论】:

  • 如果像@Cacheable(key="#spelKey")这样使用,它不能使用KeyGenerater,请参阅org.springframework.cache.interceptor.CacheAspectSupport中的generateKey(Object result)方法
猜你喜欢
  • 2012-12-21
  • 2012-06-17
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多