Spring Boot - 如何在开发过程中禁用@Cacheable?
Posted
技术标签:
【中文标题】Spring Boot - 如何在开发过程中禁用@Cacheable?【英文标题】:Spring Boot - How to disable @Cacheable during development? 【发布时间】:2016-06-25 08:05:19 【问题描述】:我正在寻找两件事:
如何在开发过程中使用 Spring 引导“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-dev.properties
。
spring.cache.type=NONE
不会关闭缓存,它会阻止缓存内容。即它仍然为您的程序添加了 27 层 AOP/拦截器堆栈,只是它不进行缓存。这取决于他所说的“全部关闭”是什么意思。
【参考方案1】:
默认情况下会自动检测和配置缓存类型。但是,您可以通过将 spring.cache.type
添加到配置中来指定要使用的缓存类型。要禁用它,请将值设置为NONE
。
如果您想对特定配置文件执行此操作,请将其添加到该配置文件 application.properties
在这种情况下修改 application-dev.properties
并添加
spring.cache.type=NONE
这将禁用缓存。
【讨论】:
我使用 SpEl 的第二个问题呢?在开发过程中有一些我不想缓存的特定方法。 davidxxx 答案是最佳答案。它准确地解释了 Spring 的行为和好的解决方案。 对于特定情况,davidxxx 的答案没有回答在@Cacheable
中使用SpEL,davidxxx 的答案太宽泛了……@PaulNUK 的答案似乎明白这一点。
旁注:您可以将其放入您的application-junit
配置文件并在所有测试中使用@ActiveProfiles("junit")
。这将停用任何测试的缓存,防止在测试运行之间保持状态(使用@Cachable
时您将拥有其他状态)。如果您想在一个显式测试中测试缓存,您可以如下注释测试类以仅在那里进行活动缓存:@TestPropertySource(properties = "spring.cache.type=")
【参考方案2】:
David Newcomb comment 说实话:
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 答案中所写相同的结果。
【讨论】:
@Alexandar Petrov 感谢您的快速反馈。我不知道如何链接到评论,我已尽力修复。 选项2与指定spring.cache.type=NONE
相同。
@M. Deinum 很可能。感谢您的反馈!【参考方案3】:
对于第二个问题,请执行以下操作:
编写一个方法来确定特定配置文件是否处于活动状态(环境是您注入的环境)
boolean isProfileActive(String profile)
return Arrays.asList(environment.getActiveProfiles()).contains(profile);
然后将其用于可缓存注释上的拼写条件
【讨论】:
以上是关于Spring Boot - 如何在开发过程中禁用@Cacheable?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Boot 应用程序中禁用/忽略 @PreAuthorize
在spring boot / spring data elasticsearch中禁用自动索引创建