[英]Spring Boot - How to disable @Cacheable during development?
我正在寻找两件事:
如何使用 Spring 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 并且它使用自动配置。
我不想让事情过于复杂。
默认情况下会自动检测和配置缓存类型。 但是,您可以通过将spring.cache.type
添加到您的配置中来指定要使用的缓存类型。 要禁用它,请将值设置为NONE
。
当您想为特定配置文件执行此操作时,将其添加到该配置文件application.properties
在这种情况下修改application-dev.properties
并添加
spring.cache.type=NONE
这将禁用缓存。
大卫纽科姆的评论说的是实话:
spring.cache.type=NONE
不会关闭缓存,它会阻止缓存内容。 即它仍然为您的程序添加了 27 层 AOP/拦截器堆栈,只是它不进行缓存。 这取决于他所说的“全部关闭”是什么意思。
使用此选项可能会加快应用程序的启动速度,但也会产生一些开销。
1)完全禁用Spring Cache功能
将@EnableCaching
类移动到专用配置类中,我们将用@Profile
包装该类以启用它:
@Profile("!dev")
@EnableCaching
@Configuration
public class CachingConfiguration {}
当然,如果您已经有一个为除dev
环境之外的所有环境启用的Configuration
类,只需重用它:
@Profile("!dev")
//... any other annotation
@EnableCaching
@Configuration
public class NoDevConfiguration {}
2)使用假(noop)缓存管理器
在某些情况下,通过配置文件激活@EnableCaching
是不够的,因为您的某些类或应用程序的某些 Spring 依赖项希望从 Spring 容器中检索实现org.springframework.cache.CacheManager
接口的 bean。
在这种情况下,正确的方法是使用一个假实现,它允许 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
属性,该属性产生与 M. Deinum 答案中写入的结果相同的结果。
对于您的第二个问题,请执行以下操作:
编写一个方法来确定特定配置文件是否处于活动状态(环境是您注入的环境)
boolean isProfileActive(String profile) {
return Arrays.asList(environment.getActiveProfiles()).contains(profile);
}
然后将其用于可缓存注释上的拼写条件
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.