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

我正在寻找2件事:

  1. 如何使用Spring启动“dev”配置文件在开发期间禁用所有缓存。没有一个常规设置来关闭应用程序属性中的所有设置。最简单的方法是什么?

  2. 如何禁用特定方法的缓存?我试图像这样使用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.typeNONE

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

spring.cache.type=NONE

这将禁用缓存。


答案 2

大卫·纽科姆的评论说的是实话:

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

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

1)完全禁用弹簧缓存功能

将类移动到专用的配置类中,我们将用 包装以启用它:@EnableCaching@Profile

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

当然,如果您已经有一个为除环境之外的所有应用程序启用的类,只需重用它:Configurationdev

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

2)使用假(noop)缓存管理器

在某些情况下,仅按配置文件激活是不够的,因为某些类或应用的某些 Spring 依赖项希望从 Spring 容器中检索实现接口的 Bean。
在这种情况下,正确的方法是使用一个假的实现,它将允许Spring解析所有依赖关系,而实现是无开销的。@EnableCachingorg.springframework.cache.CacheManagerCacheManager

我们可以通过玩 和 来实现它:@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();
    }
}

或者,如果它更合适,则可以添加生成与 M. Deinum 答案中写入的相同结果的属性。spring.cache.type=NONE


推荐