使用Cacheable时我可以执行以下操作:
@Cacheable(value = CacheUtil.LEVEL1, key = "'Location'+#root.methodName+'_'+#country+'_'+#lang")
public List<Location> getCities(String country, String lang)
它工作正常。
我不确定以下情况。如何使用Cacheable缓存以下方法?
public Content getContent(ContentRequest Request)
我应该如何编写@Cacheable以使其有效?
感谢。
答案 0 :(得分:2)
你需要这样的东西:
@Cacheable(value = CacheUtil.LEVEL1, keyGenerator="contentRequestKeyGenerator")
public Content getContent(ContentRequest Request)
其中contentRequestKeyGenerator是实现KeyGenerator接口的bean的名称,请参阅http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/cache/interceptor/KeyGenerator.html
在过去,我有一个bean为几个不同的缓存类进行密钥生成,在下面的示例中,对象[0]是调用方法的类,在您的示例中为ContentRequest:
@Component
public class MyKeyGenerator implements KeyGenerator{
@Override
public Object generate(Object o, Method method, Object... objects) {
if (String.class.isInstance(objects[0])) {
return ....
}
else if (....) {
}
}
然后你会用它:
@Cacheable(value = "properties", keyGenerator = "myKeyGenerator")
public Property getProperty(String key) {
你需要这样做吗?默认值是ContentRequest的hashCode,通常这已经足够了。