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
相关产品推荐
相关产品推荐

