【发布时间】:2019-05-09 11:09:51
【问题描述】:
在 Spring Boot 2.1 中,我在配置文件中使用 Java 配置定义了一个 RedisCacheManager bean。一切正常,但有时我想禁用它,例如在测试中。 Spring Boot 提供了spring.cache.type=NONE 来禁用缓存,根据这个documentation。但是,此属性将不起作用,因为我已经定义了一个 CacheManager,因此 Spring Boot 不会配置我想要的 NoOpCacheManager(NoOpCacheConfiguration 上有一个@ConditionalOnMissingBean(CacheManager.class),其优先级低于RedisCacheConfiguration)。
在定义缓存时,无论提供者是什么(例如 Caffeine),我们通常将它们定义为 bean,然后由 Spring Boot 的自动配置解析为 SimpleCacheManager。
比如
@Bean
public Cache myCache() {
return new CaffeineCache(
"my-cache",
Caffeine.newBuilder()
.maximumSize(10)
.build());
}
不幸的是,Redis 无法做到这一点,因为它的 Cache 实现 RedisCache 是不公开的。
我们喜欢做的另一件事是定义一个 bean CacheManagerCustomizer<?>,例如使用 Caffeine
@Bean
public CacheManagerCustomizer<CaffeineCacheManager> caffeineCacheManager() {
return cacheManager -> cacheManager
.setCaffeine(Caffeine.newBuilder()
.expireAfterWrite(1, TimeUnit.MINUTES));
}
再一次,这在 Redis 中是不可能的,因为 RedisCacheManager 是不可变的。
所以目前唯一的解决方案是创建我们自己的 RedisCacheManager,但这会阻止 spring.cache.type: NONE 的使用。
所以这是我的问题。使用 Spring Boot 配置 Redis 缓存以便我们可以根据需要禁用它的最佳方法是什么?
【问题讨论】:
-
您可以使用
@Profile("!test")忽略测试配置文件中不需要的每个Bean
标签: spring spring-boot spring-test spring-data-redis spring-cache