Автоматическая генерация ключей Ehcache и аннотация @Cacheable Spring - PullRequest
11 голосов
/ 15 марта 2012

Кто-нибудь знает, как работает генерация ключей по умолчанию для 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 ]

13 голосов
/ 15 марта 2012

Это генератор ключей по умолчанию

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);
}

}

Как видите, он объединяет хэш-коды каждого параметра метода.

5 голосов
/ 15 марта 2012

Все объясняется весной справочная документация , а именно:

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)

Так что в вашем случае вы должны просто реализовать equals() и hashCode() для FilterObject. Достойная IDE может сгенерировать их для вас.

...