Spring Boot - 如何在开发期间禁用@Cachable?

时间:2016-03-10 12:56:43

标签: java spring spring-boot spring-el spring-cache

我正在寻找两件事:

  1. 如何在Spring boot" dev"开发过程中禁用所有缓存。轮廓。在application.properties中,没有缝合作为一般设置来关闭它。什么是最简单的方法?

  2. 如何禁用特定方法的缓存?我试着像这样使用SpEl:

    @Cacheable(value = "complex-calc", condition = "#{${spring.profiles.active} != 'dev'}") public String someBigCalculation(String input){ ... }

  3. 但我可以让它发挥作用。关于SO的问题有几个问题,但它们指的是XML配置或其他东西,但我使用的是Spring Boot 1.3.3,它使用了自动配置。

    我不想让事情过于复杂。

3 个答案:

答案 0 :(得分:37)

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

如果您希望针对特定个人资料执行此操作,请将其添加到该个人资料application.properties,在这种情况下修改application-dev.properties并添加

spring.cache.type=NONE

这将禁用缓存。

答案 1 :(得分:3)

对于你的第二个问题,你可以这样做:

编写一个方法,确定特定的配置文件是否处于活动状态(环境是您注入的环境)

boolean isProfileActive(String profile) { 
   return Arrays.asList(environment.getActiveProfiles()).contains(profile);
}

然后在可缓存注释上使用它作为你的spel条件

答案 2 :(得分:1)

David Newcomb comment讲实话:

  

spring.cache.type=NONE不会关闭缓存,它可以防止出现问题   从被缓存。即它仍然增加了27层AOP /拦截器   堆栈到您的程序,只是它不进行缓存。它   取决于他所说的“全部关闭”。

使用此选项不会加快应用程序的启动速度和缓存管理器功能的开销。它根本不会缓存对象。

除了您的缓存配置外,还可以指定一个重要的max Heap参数(例如 EhCache中的maxBytesLocalHeap"4000m")将限制您在Spring Boot启动后立即分配足够的内存。如果您不使用缓存,那真是浪费。

因此,如果您要加快开发环境中Spring Boot的启动速度并减少正在运行的程序的cpu /内存开销,则必须禁用Spring缓存功能,或者使用伪造的缓存管理器(而Spring提供了该功能) )。
两种方式都应该产生非常接近的结果。

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)使用伪造的(临时)缓存管理器

在某些情况下,通过配置文件激活@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();
    }
}