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)
@Cacheable(value = "complex-calc", condition="#${spring.profiles.active} != 'dev'}")
public String someBigCalculation(String input){
...
}
我不想让事情过于复杂。默认情况下,缓存的类型是自动检测和配置的。但是,您可以通过向配置中添加
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很可能相同。谢谢你的反馈!