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

Я ищу 2 вещи:

  • Как отключить все кэширование во время разработки с помощью boot "dev". Там нет шва, чтобы быть общей настройкой, чтобы полностью отключить его в application.properties. Какой самый простой способ?

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

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

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

Я не хочу чрезмерно усложнять ситуацию.

Ответ 1

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

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

spring.cache.type=NONE

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

Ответ 2

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

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

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

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

Ответ 3

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

spring.cache.type=NONE не отключает кэширование, оно предотвращает кэширование объектов. т.е. он все еще добавляет 27 слоев стека AOP/перехватчика в вашу программу, просто он не выполняет кэширование. Это зависит от того, что он имеет в виду под "выключить все это".

Использование этой опции не ускорит запуск приложения и нагрузку на функцию диспетчера кэша. Это просто не будет кешировать объекты.

Кроме того, в конфигурации кеша можно указать важный параметр max Heap (например, maxBytesLocalHeap"4000m" в EhCache), который будет ограничивать выделение достаточного объема памяти при запуске Spring Boot. Настоящая трата, если вы не используете кеш.

Так что, если вам нужно ускорить запуск весенней загрузки в dev и уменьшить нагрузку на процессор/память работающей программы, вы должны отключить функцию кэширования Spring или, в качестве альтернативы, использовать поддельный менеджер кэша (и Spring предоставляет это).
Оба способа должны привести к очень близкому результату.

1) Отключить управление Spring Cache

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

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

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

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

2) Используйте фальшивый (noop) Cache manager

В некоторых случаях активации @EnableCaching по профилю недостаточно, потому что некоторые из ваших классов или некоторые зависимости Spring вашего приложения ожидают получить из контейнера Spring бин, реализующий интерфейс 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();
    }
}

Ответ 4

если проект SpringBoot, закомментируйте @EnableCaching в классе Application, например:

 //@EnableCaching
 @SpringBootApplication
 public class CacheapplicationApplication{
     public static void main(String[] args){}

}