В чем разница между @CacheEvict(...) и @CacheEvict(value, allEntries)?
Я заметил несколько строк @CacheEvict("Настройки") в некотором исходном коде, и мне было любопытно, делает ли то же самое, что и CacheEvict (значение = "Настройки", allEntries = true)?
2 ответа
Когда @CacheEvict
указан без key
атрибут, все параметры метода используются для создания ключа для записи, которая будет исключена, поэтому
@CacheEvict("Settings")
public String doThing(String foo, Integer bar) {
// ...
}
... выселит запись с помощью составного ключа {foo
, bar
}. Генератор ключей по умолчанию, используемый для создания составного ключа: SimpleKeyGenerator
, который возвращает SimpleKey
экземпляры, которые содержат ссылки на параметры метода для сравнения.
Если метод не имеет параметров, ключ по умолчанию SimpleKey.EMPTY
,
Атрибут allEntries
не может быть установлен в true
если вы укажете key
атрибутов; они взаимоисключающие. Если установлено true
все записи в кэше будут удаляться каждый раз, когда вызывается аннотированный метод.
Так...
@CacheEvict("Settings", allEntries = true)
public String doThing(String foo, Integer bar) {
// ...
}
... опустошит Settings
кэшировать каждый раз, когда метод вызывается, независимо от параметров метода.
Просто посмотрите на его Javadoc.
Вы заметите значение по умолчанию для allEntries
является false
, Так что нет, это не одно и то же.
использование allEntries = true
только когда вы хотите новый кеш каждый раз, когда выполняется операция.
Все ли записи внутри кеша удалены. По умолчанию удаляется только значение под связанным ключом.
Если вы хотите увидеть детали реализации, просто посмотрите на Coffeine.