Spring Boot - 如何在开发过程中禁用@Cacheable?

新手上路,请多包涵

我正在寻找两件事:

  1. 如何在使用 Spring 引导“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,它使用自动配置。

我不想让事情过于复杂。

原文由 Wouter 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.2k
2 个回答

David Newcomb 的评论 道出了真相:

spring.cache.type=NONE 不会关闭缓存,它会阻止缓存内容。即它仍然向您的程序添加 27 层 AOP/拦截器堆栈,只是它不执行缓存。这取决于他所说的“全部关闭”是什么意思。

使用此选项可能会加快应用程序的启动速度,但也会产生一些开销。

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 容器中检索实现 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 答案中所写相同结果的属性。

原文由 davidxxx 发布,翻译遵循 CC BY-SA 4.0 许可协议

默认情况下,缓存的类型是自动检测和配置的。但是,您可以通过将 spring.cache.type 添加到您的配置来指定要使用的缓存类型。要禁用它,请将值设置为 NONE

当您想为特定配置文件执行此操作时,将其添加到该配置文件 application.properties 在这种情况下修改 application-dev.properties 并添加

spring.cache.type=NONE

这将禁用缓存。

原文由 M. Deinum 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题