我在找两样东西:
1.如何在开发过程中使用Sping Boot “dev”profile禁用所有缓存。application.properties中似乎没有一个通用的设置来关闭它。最简单的方法是什么?
1.如何禁用特定方法的缓存?我试着像这样使用SpEl:
@Cacheable(value = "complex-calc", condition="#${spring.profiles.active} != 'dev'}")
public String someBigCalculation(String input){
...
}
字符串
但是我可以让它工作。SO上有几个问题与此相关,但它们涉及XML config或其他东西,但我使用的是Sping Boot 1.3.3,这使用了自动配置。
我不想把事情弄得太复杂
6条答案
按热度按时间kjthegm61#
默认情况下,缓存类型是自动检测和配置的。但是,您可以通过将
spring.cache.type
添加到配置中来指定要使用的缓存类型。要禁用它,请将值设置为NONE
。如果您想为特定的配置文件执行此操作,请将其添加到该配置文件
application.properties
(在本例中,修改application-dev.properties
并添加字符串
这将禁用缓存。
jslywgbw2#
David Newcomb comment说的是实话:
spring.cache.type=NONE
并没有关闭缓存,它阻止了缓存。也就是说,它仍然向你的程序添加了27层AOP/拦截器堆栈,只是它没有做缓存。这取决于他所说的“把它全部关闭”是什么意思。使用此选项可能会加快应用程序的启动速度,但也可能会产生一些开销。
1)完全禁用Spring Cache功能
将
@EnableCaching
类移动到一个专用的配置类中,我们将用@Profile
Package 以启用它:字符串
当然,如果你已经有一个
Configuration
类,除了dev
环境之外,其他环境都可以使用,那么就重用它吧:型
2)使用假的(noop)缓存管理器
在某些情况下,通过配置文件激活
@EnableCaching
是不够的,因为您的一些类或应用程序的一些Spring依赖项期望从Spring容器中检索实现org.springframework.cache.CacheManager
接口的bean。在这种情况下,正确的方法是使用一个假的实现,这将允许Spring解决所有依赖关系,而
CacheManager
的实现是无开销的。我们可以通过使用
@Bean
和@Profile
来实现它:型
或者,如果它更合适,您可以添加
spring.cache.type=NONE
属性,该属性将产生与M.代努姆答案中所写的相同的结果。vsmadaxz3#
如果你只有一个默认配置文件,不想为此创建一个开发和生产配置文件,我认为这可能是一个非常快速的解决方案:
在
application.properties
中设置:字符串
根据您的需求,您可以将其更改为
true
/false
。现在,在定义@Caching bean时,请执行以下操作:
型
当属性设置为
false
时,将返回NoOpCacheManager()
,从而有效地关闭缓存。mlnl4t2r4#
对于你的第二个问题,做这样的事情:
编写一个方法来确定一个特定的配置文件是否是活动的(环境是您注入的Environment)
字符串
然后将其用于可缓存注解上的缓存条件
5lhxktic5#
在任何类中,您都可以在每个方法的基础上全局启用或禁用缓存,您可以执行以下操作,这允许您在类级别控制如何缓存方法。
您可以在
application.properties
中使用my.cache.enabled=true
更改它。此设置当前默认为启用。当然,你也可以在
application-dev.properties
中修改它,并将其设置为不同的值。这种方法的优点是,如果你出于某种原因需要,它可以让这个过程变得更复杂,也可以在每个方法的基础上。字符串
yizd12fk6#
你可以在org. springframework. cache. annotation. CachingConfigurer中使用Web 4j-spring-boot 2依赖项。这个解决方案将与最新的Spring-boot版本6.x一起工作。它对我很有效。
下面是代码片段:
Pom.xml:
字符串
缓存配置类:
型
CustomCacheErrorClass:
型
CircuitBreakerConfig.java配置类:
型