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