Spring Boot — как отключить @Cacheable во время разработки?

Я ищу 2 вещи:

  1. Как отключить все кеширование во время разработки с профилем Spring boot «dev». В application.properties нет общей настройки, позволяющей отключить все это. Какой самый простой способ?

  2. Как отключить кеширование для определенного метода? Я пытался использовать SpEl следующим образом:

    @Cacheable(value = "complex-calc", condition="#${spring.profiles.active} != 'dev'}")
    public String someBigCalculation(String input){
       ...
    }
    

Но я могу заставить его работать. Есть пара вопросов по SO, связанных с этим, но они относятся к конфигурации XML или другим вещам, но я использую Spring Boot 1.3.3, и здесь используется автоматическая настройка.

Я не хочу слишком усложнять вещи.


person Wouter    schedule 10.03.2016    source источник
comment
добавьте spring.cache.type=NONE к вашему application-dev.properties.   -  person M. Deinum    schedule 10.03.2016
comment
spring.cache.type=NONE не отключает кеширование, оно предотвращает кеширование вещей. то есть он по-прежнему добавляет в вашу программу 27 слоев стека АОП/перехватчика, просто он не выполняет кэширование. Это зависит от того, что он имеет в виду под выключением всего этого.   -  person David Newcomb    schedule 29.06.2017


Ответы (3)


Комментарий Дэвида Ньюкомба говорит правду:

spring.cache.type=NONE не отключает кеширование, оно предотвращает кеширование вещей. то есть он по-прежнему добавляет в вашу программу 27 слоев стека АОП/перехватчика, просто он не выполняет кэширование. Это зависит от того, что он подразумевает под «выключить все это».

Использование этого параметра может ускорить запуск приложения, но также может иметь некоторые накладные расходы.

1) Чтобы полностью отключить функцию Spring Cache

Переместите класс @EnableCaching в выделенный класс конфигурации, который мы обернем @Profile, чтобы включить его:

@Profile("!dev")
@EnableCaching
@Configuration
public class CachingConfiguration {}

Конечно, если у вас уже есть класс Configuration, который включен для всех, кроме среды dev, просто используйте его повторно:

@Profile("!dev")
//... any other annotation 
@EnableCaching
@Configuration
public class NoDevConfiguration {}

2) Используйте фальшивый (noop) менеджер кеша

В некоторых случаях активации @EnableCaching по профилю недостаточно, поскольку некоторые из ваших классов или некоторые зависимости Spring вашего приложения ожидают извлечения из контейнера Spring bean-компонента, реализующего интерфейс org.springframework.cache.CacheManager.
В этом случае правильным способом является использование поддельная реализация, которая позволит Spring разрешать все зависимости, в то время как реализация CacheManager не требует накладных расходов.

Мы могли бы добиться этого, играя с @Bean и @Profile :

import org.springframework.cache.support.NoOpCacheManager; 

@Configuration
public class CacheManagerConfiguration {

    @Bean
    @Profile("!dev")
    public CacheManager getRealCacheManager() {
        return new CaffeineCacheManager(); 
        // or any other implementation
        // return new EhCacheCacheManager(); 
    }

    @Bean
    @Profile("dev")
    public CacheManager getNoOpCacheManager() {
        return new NoOpCacheManager();
    }
}

Или, если это больше подходит, вы можете добавить свойство spring.cache.type=NONE, которое дает тот же результат, что и в ответе М. Дейнума.

person davidxxx    schedule 05.07.2019
comment
@Alexandar Petrov Спасибо за быстрый отзыв. Не знаю как сделать ссылку на комментарий, исправил, как смог. - person davidxxx; 05.07.2019
comment
Вариант 2 аналогичен указанию spring.cache.type=NONE. - person M. Deinum; 28.08.2019
comment
@М. Дейнум Очень возможно. Спасибо за ваш отзыв ! - person davidxxx; 29.08.2019

Тип кэша по умолчанию определяется и настраивается автоматически. Однако вы можете указать, какой тип кэша использовать, добавив spring.cache.type в свою конфигурацию. Чтобы отключить его, установите значение NONE.

Поскольку вы хотите сделать это для определенного профиля, добавьте его в этот профиль application.properties, в этом случае измените application-dev.properties и добавьте

spring.cache.type=NONE

Это отключит кеширование.

person M. Deinum    schedule 10.03.2016
comment
Как насчет моего второго вопроса с использованием SpEl? Есть некоторые конкретные методы, для которых я не хочу кэшировать во время разработки. - person Wouter; 10.03.2016
comment
Ответ davidxxx является лучшим ответом. Это точно объясняет поведение Spring и хорошие решения. - person Nicolas Dos Santos; 28.08.2019
comment
Ответ davidxxx не отвечает на использование SpEL в @Cacheable для конкретных случаев, ответ davidxxx слишком широк ... Ответ @PaulNUK, кажется, понимает это. - person maxxyme; 24.09.2020
comment
Примечание: вы можете поместить это в свой профиль application-junit и использовать @ActiveProfiles("junit") во всех своих тестах. Это отключит кеширование для любых тестов, предотвращая сохранение состояний между тестовыми запусками (которое у вас будет в противном случае при использовании @Cachable). Если вы хотите протестировать кэширование в одном явном тесте, вы можете аннотировать тестовый класс следующим образом для активного кэширования только там: @TestPropertySource(properties = "spring.cache.type=") - person membersound; 08.04.2021

Для вашего второго вопроса сделайте что-то вроде этого:

Напишите метод, который определяет, активен ли конкретный профиль (среда — это ваша введенная среда)

boolean isProfileActive(String profile) { 
   return Arrays.asList(environment.getActiveProfiles()).contains(profile);
}

затем используйте это для вашего условия правописания в кешируемой аннотации

person PaulNUK    schedule 23.03.2016