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

Spring 5.3.23/Spring Boot2.7.0中如何为CacheErrorHandler注入Bean?

解决方案

方式一:实现CachingConfigurer接口并注入依赖

你可以在实现CachingConfigurer的配置类中直接注入所需依赖,配置类本身是Spring管理的Bean,完全支持依赖注入,之后在errorHandler()方法中创建带依赖的自定义CacheErrorHandler实例即可:

@Configuration
@EnableCaching
public class CacheConfig implements CachingConfigurer {

    private final SomeDependency someDependency;

    // 构造注入(推荐方式)
    public CacheConfig(SomeDependency someDependency) {
        this.someDependency = someDependency;
    }

    @Override
    public CacheErrorHandler errorHandler() {
        // 传入依赖创建自定义错误处理器
        return new CustomCacheErrorHandler(someDependency);
    }
}

方式二:直接声明CacheErrorHandler类型的Bean

在Spring Boot 2.7.0(对应Spring Framework 5.3.23)版本中,直接声明CacheErrorHandler类型的Bean会被缓存自动配置识别并优先使用,无需实现CachingConfigurer接口。

比如用@Component标记自定义错误处理器:

@Component
public class CustomCacheErrorHandler implements CacheErrorHandler {

    private final SomeDependency someDependency;

    public CustomCacheErrorHandler(SomeDependency someDependency) {
        this.someDependency = someDependency;
    }

    @Override
    public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {
        // 使用依赖处理缓存读取错误,比如日志记录、告警
        someDependency.recordCacheError("读取缓存失败,key: " + key, exception);
    }

    @Override
    public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) {
        someDependency.recordCacheError("写入缓存失败,key: " + key, exception);
    }

    @Override
    public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) {
        someDependency.recordCacheError("删除缓存失败,key: " + key, exception);
    }

    @Override
    public void handleCacheClearError(RuntimeException exception, Cache cache) {
        someDependency.recordCacheError("清空缓存失败", exception);
    }
}

也可以用@Bean在配置类中声明:

@Configuration
public class CacheBeanConfig {

    @Bean
    public CacheErrorHandler cacheErrorHandler(SomeDependency someDependency) {
        return new CustomCacheErrorHandler(someDependency);
    }
}

只要该Bean存在于Spring容器中,缓存基础设施就会自动使用它,替代默认的SimpleCacheErrorHandler。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:15:55