簡體   English   中英

Ehcache自動密鑰生成和@Cacheable spring注釋

[英]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 參考文檔中解釋,即:

28.3.1.1默認密鑰生成

[...]

  • 如果給出更多的一個參數,則返回從所有參數的哈希計算出的密鑰。

要提供不同的默認密鑰生成器,需要實現org.springframework.cache.KeyGenerator接口。 配置完成后,生成器將用於每個未指定自己的密鑰生成策略的聲明(見下文)。

及以下:

28.3.1.2自定義密鑰生成聲明

[...] @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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM