Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Boot-如何在开发过程中禁用@Cacheable?_Java_Spring_Spring Boot_Spring El_Spring Cache - Fatal编程技术网

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

Java Spring Boot-如何在开发过程中禁用@Cacheable?,java,spring,spring-boot,spring-el,spring-cache,Java,Spring,Spring Boot,Spring El,Spring Cache,我在寻找两件事: 如何使用Spring boot“dev”概要文件在开发过程中禁用所有缓存。在application.properties中不需要常规设置将其全部关闭。最简单的方法是什么 如何禁用特定方法的缓存?我试着这样使用SpEl: @Cacheable(value = "complex-calc", condition="#${spring.profiles.active} != 'dev'}") public String someBigCalculation(String input)

我在寻找两件事:

  • 如何使用Spring boot“dev”概要文件在开发过程中禁用所有缓存。在application.properties中不需要常规设置将其全部关闭。最简单的方法是什么

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

    @Cacheable(value = "complex-calc", condition="#${spring.profiles.active} != 'dev'}")
    public String someBigCalculation(String input){
       ...
    }
    
  • 但我可以让它工作。有几个问题与此相关,但它们涉及XML配置或其他内容,但我使用的是Spring Boot 1.3.3,这使用的是自动配置


    我不想让事情过于复杂。

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

    当您要为特定概要文件执行此操作时,请将其添加到该概要文件
    application.properties
    。在本例中,请修改
    application-dev.properties
    并添加

    spring.cache.type=NONE
    

    这将禁用缓存

    对于第二个问题,请执行以下操作:

    @Cacheable(value = "complex-calc", condition="#${spring.profiles.active} != 'dev'}")
    public String someBigCalculation(String input){
       ...
    }
    
    编写一个确定特定概要文件是否处于活动状态的方法(环境是您的注入环境)

    然后将其用于可缓存注释上的spel条件

    说明真相:


    spring.cache.type=NONE
    不会关闭缓存,它会阻止事情发生 从被缓存。i、 e.它仍然增加了27层AOP/拦截器 堆栈到您的程序,只是它不做缓存。信息技术 这取决于他所说的“关掉一切”是什么意思

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

    1)完全禁用Spring缓存功能

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

    @Profile("!dev")
    @EnableCaching
    @Configuration
    public class CachingConfiguration {}
    
    当然,如果您已经有了一个
    配置
    类,该类对
    开发
    环境以外的所有环境都启用,只需重新使用它:

    @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答案中写入的结果相同的结果

    spring.cache.type=NONE
    添加到
    application-dev.properties
    spring.cache.type=NONE
    不会关闭缓存,它会阻止缓存内容。i、 它仍然在你的程序中添加了27层AOP/拦截器堆栈,只是它没有缓存。这取决于他所说的“把一切都关掉”是什么意思。我的第二个问题用SpEl怎么说?有一些特定的方法我不希望在开发过程中使用缓存。答案是最好的答案。它准确地解释了Spring的行为和良好的解决方案。davidxxx的答案并不适用于在
    @Cacheable
    中使用SpEL。对于特定情况,davidxxx的答案太宽泛了@PaulNUK的回答似乎明白这一点。旁注:您可以将其放入
    应用程序junit
    配置文件中,并在所有测试中使用
    @ActiveProfiles(“junit”)
    。这将取消对任何测试的缓存,防止在测试运行之间保持状态(在使用
    @Cachable
    时将保持状态)。如果您想在一个显式测试中测试缓存,那么您可以按如下方式将testclass注释为仅在那里的活动缓存:
    @TestPropertySource(properties=“spring.cache.type=”)
    @Alexandar Petrov感谢您的快速反馈。我不知道如何链接到注释,我尽可能地修复了它。选项2与指定
    spring.cache.type=NONE
    @M.Deinum很可能相同。谢谢你的反馈!