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

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

@Component
public class StatService {

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

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

我想将它们放在同一个缓存中 – ehcache.xml:

<cache name="statCalc"
       ...
/>

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

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

附:请不要提及为不同方法使用相同缓存可能是错误的,只是帮助解决这个问题.

解决方法:

使用自定义KeyGenerator,例如

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”)注释添加到可缓存方法

上一篇:Spring @Cacheable没有缓存


下一篇:java – 如何正确使用getHibernateTemplate().setCacheQueries()?