假设我有两个不同的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)缓存的值。
使用方法名构建密钥的最简单方法是什么?
请不要提及在不同的方法中使用相同的缓存可能是错误的,只是帮助解决了这个问题。
发布于 2016-04-20 10:38:43
使用自定义的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")注释添加到可缓存方法中。
发布于 2016-04-20 11:18:25
Spring抽象允许您使用SpeL来指定缓存键。例如,您可以使用方法名称、参数值等。
例如
@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。
https://stackoverflow.com/questions/36741090
复制相似问题