Spring可以使用对象缓存

时间:2017-03-22 07:42:33

标签: java spring

使用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以使其有效?

感谢。

1 个答案:

答案 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,通常这已经足够了。