You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中如何仅启用指定Caffeine缓存名称并禁用其余缓存?

解决Spring Boot仅启用指定缓存名称的问题

你遇到的问题是因为Spring Cache默认会尝试为每个@Cacheable注解指定的缓存名称创建对应实例,但你只通过spring.cache.cache-names配置了cache1,当调用标注cache2等其他缓存名称的方法时,找不到对应缓存实例就会报错。

要实现仅启用指定缓存名称,同时让其他缓存注解的方法正常执行(不触发缓存),可以通过以下两种方式:

方法一:自定义CacheManager(推荐)

编写缓存配置类,只初始化你需要的cache1,并对其他未指定的缓存名称返回空实现的缓存,既不会报错,也不会缓存这些方法的结果:

import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCache;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.github.benmanes.caffeine.cache.Caffeine;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

@Configuration
@EnableCaching
public class CustomCacheConfig {

    private final Map<String, Cache> cacheStore = new ConcurrentHashMap<>();

    @Bean
    public CacheManager cacheManager() {
        // 初始化需要启用的cache1,配置缓存规则
        Caffeine<Object, Object> caffeineSpec = Caffeine.newBuilder()
                .maximumSize(100)
                .expireAfterAccess(300, TimeUnit.SECONDS);
        cacheStore.put("cache1", new CaffeineCache("cache1", caffeineSpec.build()));

        return new CacheManager() {
            @Override
            public Cache getCache(String cacheName) {
                // 只返回已配置的缓存,其他返回空实现
                return cacheStore.getOrDefault(cacheName, new Cache() {
                    @Override
                    public String getName() { return cacheName; }
                    @Override
                    public Object getNativeCache() { return null; }
                    @Override
                    public <T> T get(Object key, Class<T> type) { return null; }
                    @Override
                    public ValueWrapper get(Object key) { return null; }
                    @Override
                    public void put(Object key, Object value) {}
                    @Override
                    public ValueWrapper putIfAbsent(Object key, Object value) { return null; }
                    @Override
                    public void evict(Object key) {}
                    @Override
                    public void clear() {}
                });
            }

            @Override
            public Iterable<String> getCacheNames() {
                return cacheStore.keySet();
            }
        };
    }
}

配置完成后,cache1会正常生效,其他标注cache2/cache3等的方法会直接执行逻辑,不会触发缓存,也不会报错。

方法二:利用缓存条件表达式(适合少量方法修改)

如果非目标缓存方法不多,可以直接在对应的@Cacheable注解上添加condition属性,让这些方法不触发缓存:

// cache2的方法直接跳过缓存
@Cacheable(value = "cache2", condition = "#false")
public Object someMethod2() {
    // 方法逻辑
}

这种方式不需要修改配置类,但需要逐个修改非目标缓存的方法注解,适合方法数量较少的场景。


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:30:36