首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在同一个ehCache中缓存2种不同的bean方法?

如何在同一个ehCache中缓存2种不同的bean方法?
EN

Stack Overflow用户
提问于 2016-04-20 10:32:06
回答 2查看 4.8K关注 0票数 10

假设我有两个不同的bean方法,我想通过EhCache缓存这些方法:

代码语言:javascript
复制
@Component
public class StatService {

@Cacheable(value = "statCalc")
public int getMeth1(int param) {
    // LOGIC1
}

@Cacheable(value = "statCalc")
public int getMeth2(int param) {
    // LOGIC2
}
}

我想将它们驻留在同一个缓存中- ehcache.xml:

代码语言:javascript
复制
<cache name="statCalc"
       ...
/>

问题是缓存密钥是由输入参数而不是方法签名生成的,因此getMeth2(1)可以返回getMeth1(1)缓存的值。

使用方法名构建密钥的最简单方法是什么?

请不要提及在不同的方法中使用相同的缓存可能是错误的,只是帮助解决了这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-20 10:38:43

使用自定义的KeyGenerator

代码语言:javascript
复制
public class CustomKeyGenerator implements KeyGenerator{
    @Override
    public Object generate(Object target, Method method, Object... params) {
        StringBuilder key = new StringBuilder();
        //include method name in key
        key.append(method.getName());
        if (params.length > 0) {
            key.append(';');
            for (Object argument : params) {
                key.append(argument);
                key.append(';');
            }
        }
        return key.toString();
    }
}

将密钥生成器注册为bean,并将@CacheKeyStrategy("keyGeneratorBeanName")注释添加到可缓存方法中。

票数 7
EN

Stack Overflow用户

发布于 2016-04-20 11:18:25

Spring抽象允许您使用SpeL来指定缓存键。例如,您可以使用方法名称、参数值等。

例如

代码语言:javascript
复制
@Component
public class StatService {

   @Cacheable(value="statCalc",key="#root.method.name.concat(':').concat(#param)")
   public int getMeth1(int param) {
      // LOGIC1
   }

   @Cacheable(value="statCalc",key="#root.method.name.concat(':').concat(#param)")
   public int getMeth2(int param) {
   // LOGIC2
   }
}

对于方法调用getMeth1(5),键是getMethod1 1:5,因为方法调用getMethod1(0)键将是getMethod1 1:0

对于方法调用getMeth2(3),关键是getMethod2 2:3。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36741090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档