[英]Ehcache automatic key generation and @Cacheable spring annotation
有誰知道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
注釋文檔中形成此類方法的緩存密鑰的確切信息。 我很感激有關此主題的任何信息和建議。
這是默認密鑰生成器
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);
}
}
如您所見,它結合了每個方法參數的哈希碼。
一切都在Spring 參考文檔中解釋,即:
[...]
- 如果給出更多的一個參數,則返回從所有參數的哈希計算出的密鑰。
要提供不同的默認密鑰生成器,需要實現
org.springframework.cache.KeyGenerator
接口。 配置完成后,生成器將用於每個未指定自己的密鑰生成策略的聲明(見下文)。
及以下:
[...] @Cacheable注釋允許用戶通過其鍵屬性指定密鑰的生成方式。 開發人員可以使用SpEL來選擇感興趣的參數[...]
以及來自文檔的示例:
@Cacheable(value="books", key="#isbn.rawNumber")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
因此,在您的情況下,您應該只為FilterObject
實現equals()
和hashCode()
。 體面的IDE可以為您生成它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.