Iva*_*vov 11 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) {
....
}
Run Code Online (Sandbox Code Playgroud)
哪里FilterObject是自定义POJO,我应该期望什么是实际的缓存键?
我观察的是当使用不同的FilterObject实例而不更改我的方法调用的其他参数时,它总是产生相同的结果 - 第一个调用的结果被缓存并返回.
可能是FilterObject导致行为的POJO - 我认为它是一些序列化或.toString()问题,因为我没有覆盖相关方法.
我仍然无法找到有关如何在Ehcache的网站和@Cacheable注释文档中形成此类方法的缓存密钥的确切信息.我很感激有关此主题的任何信息和建议.
pap*_*pap 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);
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,它结合了每个方法参数的哈希码.
一切都在Spring 参考文档中解释,即:
[...]
- 如果给出了更多的参数,则返回从所有参数的哈希计算出的密钥.
要提供不同的默认密钥生成器,需要实现该
org.springframework.cache.KeyGenerator接口.配置完成后,生成器将用于每个未指定自己的密钥生成策略的声明(见下文).
及以下:
[...] @Cacheable注释允许用户通过其键属性指定密钥的生成方式.开发人员可以使用SpEL来选择感兴趣的参数[...]
以及来自文档的示例:
@Cacheable(value="books", key="#isbn.rawNumber")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
Run Code Online (Sandbox Code Playgroud)
所以在你的情况下,你应该简单地实现equals()和hashCode()为FilterObject.体面的IDE可以为您生成它们.
| 归档时间: |
|
| 查看次数: |
15290 次 |
| 最近记录: |