Ehcache自动密钥生成和@Cacheable spring注释

时间:2012-03-15 11:49:48

标签: java spring ehcache pojo method-parameters

有人知道Ehcache的默认密钥生成是如何工作的吗?如果我有以下方法:

@Cacheable(cacheName = CACHE_KEY) // CACHE_KEY is static final field.
public List<DataObject> list(
    int firstRecord, int maxRecords, int pageSize, FilterObject filter) {
    ....
}

其中FilterObject是自定义POJO,我应该期望什么是实际的缓存键?

我观察的是当使用不同的FilterObject实例并且不更改我的方法调用的其他参数时,它总是产生相同的结果 - 第一个调用的结果被缓存并返回。

可能是导致行为的FilterObject POJO - 我认为它是一些序列化或.toString()问题,因为我没有覆盖相关方法。

仍然无法找到有关如何在Ehcache网站和@Cacheable注释文档中形成此方法的缓存密钥的确切信息。 我很感激有关此主题的任何信息和建议。

2 个答案:

答案 0 :(得分:13)

这是默认密钥生成器

public class DefaultKeyGenerator implements KeyGenerator {

public static final int NO_PARAM_KEY = 0;
public static final int NULL_PARAM_KEY = 53;

public Object generate(Object target, Method method, Object... params) {
    if (params.length == 1) {
        return (params[0] == null ? NULL_PARAM_KEY : params[0]);
    }
    if (params.length == 0) {
        return NO_PARAM_KEY;
    }
    int hashCode = 17;
    for (Object object : params) {
        hashCode = 31 * hashCode + (object == null ? NULL_PARAM_KEY : object.hashCode());
    }
    return Integer.valueOf(hashCode);
}

}

如您所见,它结合了每个方法参数的哈希码。

答案 1 :(得分:5)

所有内容都在Spring reference documentation中解释,即:

28.3.1.1 Default Key Generation

  

[...]

     
      
  • 如果给出的参数更多,则返回一个从所有参数的哈希计算的
  •   
     

要提供不同的默认密钥生成器,需要实现org.springframework.cache.KeyGenerator接口。配置完成后,生成器将用于每个未指定自己的密钥生成策略的声明(见下文)。

及以下:

28.3.1.2 Custom Key Generation Declaration

  

[@] @Cacheable注释允许用户通过其键属性指定密钥的生成方式。开发人员可以使用SpEL来选择感兴趣的参数[...]

来自文档的一个例子:

@Cacheable(value="books", key="#isbn.rawNumber")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

因此,在您的情况下,您应该只为equals()实施hashCode()FilterObject。体面的IDE可以为你生成它们。