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

