我正在寻找两件事:
如何在Spring boot" dev"开发过程中禁用所有缓存。轮廓。在application.properties中,没有缝合作为一般设置来关闭它。什么是最简单的方法?
如何禁用特定方法的缓存?我试着像这样使用SpEl:
@Cacheable(value = "complex-calc", condition = "#{${spring.profiles.active} != 'dev'}")
public String someBigCalculation(String input){
...
}
但我可以让它发挥作用。关于SO的问题有几个问题,但它们指的是XML配置或其他东西,但我使用的是Spring Boot 1.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)
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();
}
}