Вы неправильно поняли назначение атрибута "condition
" аннотации @Cacheable
. Согласно документации а>...
Если true, метод кэшируется, если нет, он ведет себя так, как будто метод не кэширован, то есть выполняется каждый раз, независимо от того, какие значения находятся в кеше или какие аргументы используются.
Атрибут condition
просто определяет, следует ли сначала обращаться к кешу (например, Redis) перед выполнением (потенциально дорогого) метода. Если condition
оценивается как false, метод всегда будет выполняться, а результат впоследствии кэшируется.
Я предполагаю, что в приложении только для чтения вы хотите сначала обратиться к кешу, если значение не находится в кеше, затем выполните метод, однако НЕ кэшируйте результат. Это правильно?
Если это так, то вам нужно только указать атрибут unless
вместо атрибута condition
вот так...
@Cacheable(value="books", key="#isbn", unless="true")
void someBookMutatingOperation(String isbn, ...) { .. }
Если, однако, вы хотите вообще избежать вызова кэшируемого метода в приложении только для чтения (версии) и просто обращаться к кешу независимо от того, существует ли значение в кеше на самом деле или нет, тогда ваша проблема немного больше. сложный/трудный.
Абстракция кэша Spring работает на предпосылке, что если значение не находится в кеше, то оно вернет null, чтобы указать на промах кеша, за которым затем следует последующий вызов метода. Только когда кеш возвращает значение для указанного ключа (ов), можно избежать вызова метода.
Без пользовательского расширения (возможно, с использованием (дополнительных) перехватчиков АОП) невозможно избежать поведения OOTB.
Я не буду подробно останавливаться на этом более позднем методе, если только ваш вариант использования не требует этого.
Надеюсь это поможет.
person
John Blum
schedule
22.12.2015