You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot自定义RedisCacheManager后如何按需禁用缓存?

刚好我之前也碰到过这个棘手的问题,自定义RedisCacheManager后,spring.cache.type=NONE就失效了,核心原因正如你所说:Spring Boot的NoOpCacheConfiguration上有@ConditionalOnMissingBean(CacheManager.class)注解,只要我们自己定义了CacheManager Bean,它就不会被加载。下面给你两个实用的解决方案:

方案一:用条件注解控制RedisCacheManager的注册

我们可以给自定义的RedisCacheManager Bean加上条件判断,只有当缓存类型为REDIS(或者未配置时)才创建它,这样当设置spring.cache.type=NONE时,这个Bean不会被注册,Spring Boot就会自动启用NoOpCacheManager。

代码示例:

@Configuration
public class RedisCacheConfig {

    @Bean
    @ConditionalOnProperty(
        name = "spring.cache.type",
        havingValue = "REDIS",
        matchIfMissing = true
    )
    public RedisCacheManager redisCacheManager(RedisConnectionFactory connectionFactory) {
        // 这里是你的自定义RedisCacheManager构建逻辑
        RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(15));
        
        return RedisCacheManager.builder(connectionFactory)
                .cacheDefaults(defaultCacheConfig)
                .build();
    }
}

这里的@ConditionalOnProperty注解做了三件事:

  • spring.cache.type=REDIS时,创建RedisCacheManager Bean
  • matchIfMissing=true保证默认情况下(没配置缓存类型)依然会注册RedisCacheManager,和原来的行为一致
  • 当设置spring.cache.type=NONE时,这个Bean不会被创建,此时Spring Boot会因为找不到CacheManager Bean,自动触发NoOpCacheConfiguration的加载,实现缓存禁用

方案二:手动根据配置选择CacheManager实现

如果需要更灵活的控制,也可以自己在配置类里接管CacheManager的创建逻辑,直接根据配置值返回对应的实现:

@Configuration
public class CacheConfig {

    @Bean
    public CacheManager cacheManager(
        RedisConnectionFactory connectionFactory,
        @Value("${spring.cache.type:REDIS}") CacheType cacheType
    ) {
        if (CacheType.NONE.equals(cacheType)) {
            // 返回NoOpCacheManager,完全禁用缓存
            return new NoOpCacheManager();
        }
        
        // 自定义RedisCacheManager的构建逻辑
        RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(15));
        
        return RedisCacheManager.builder(connectionFactory)
                .cacheDefaults(defaultCacheConfig)
                .build();
    }
}

这个方案更直接,我们自己判断配置的缓存类型,当设置为NONE时直接返回NoOpCacheManager,不需要依赖Spring Boot的自动配置逻辑,逻辑更清晰。

补充说明

其实本质上就是要打破“自定义RedisCacheManager始终存在”的局面,要么让它在禁用条件下不注册,要么直接返回NoOp的实现,这样Spring的缓存机制就能正确切换到禁用状态了。

内容的提问来源于stack exchange,提问作者Lukas Cardot

火山引擎 最新活动