gpt4 book ai didi

java - 自定义 CacheInterceptor 被默认 Spring 的 CacheInterceptor 覆盖

转载 作者:搜寻专家 更新时间:2023-11-01 03:45:54 29 4
gpt4 key购买 nike

我已经实现了一个自定义的 CacheInterceptor,它允许通过通配符逐出缓存:

public class CustomCacheInterceptor extends CacheInterceptor {

private static final Logger LOGGER = LoggerFactory.getLogger(CustomCacheInterceptor.class);

@Override
protected void doEvict(Cache cache, Object key) {
try {
// evict cache
} catch (RuntimeException ex) {
getErrorHandler().handleCacheEvictError(ex, cache, key);
}
}
}

现在我正在努力让它工作:

@Configuration
public class CustomProxyCachingConfiguration extends ProxyCachingConfiguration {

private static final Logger LOGGER = LoggerFactory.getLogger(CustomProxyCachingConfiguration.class);

@Bean
public CacheInterceptor cacheInterceptor() {
LOGGER.info("Creating custom cache interceptor");

CacheInterceptor interceptor = new CustomCacheInterceptor();
interceptor.setCacheOperationSources(cacheOperationSource());
if (this.cacheResolver != null) {
interceptor.setCacheResolver(this.cacheResolver);
} else if (this.cacheManager != null) {
interceptor.setCacheManager(this.cacheManager);
}
if (this.keyGenerator != null) {
interceptor.setKeyGenerator(this.keyGenerator);
}
if (this.errorHandler != null) {
interceptor.setErrorHandler(this.errorHandler);
}
return interceptor;
}
}

问题是我的 CustomCacheInterceptor 被默认覆盖了:

Overriding user-defined bean definition for bean 'cacheInterceptor' with a framework-generated bean definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=customProxyCachingConfiguration; factoryMethodName=cacheInterceptor; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/package/test/CustomProxyCachingConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.cache.annotation.ProxyCachingConfiguration; factoryMethodName=cacheInterceptor; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/cache/annotation/ProxyCachingConfiguration.class]]

我尝试了不同的方法来解决这个问题:

1) 尝试使用 @ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ProxyCachingConfiguration.class)) 排除 ProxyCachingConfiguration 并提供自己的BeanFactoryCacheOperationSourceAdvisor - 没有帮助

2) 尝试过 @Primary 但它似乎只在注入(inject)时有效 - 而不是我的情况

3) 尝试选择不同的 bean 名称 - “customCacheInterceptor” - 在这种情况下我的自定义类没有被调用

4) 尝试添加位于 ProxyCachinConfiguration 中的 @DependsOn("cacheOperationSource") 以使 Spring 在我的配置之前加载 ProxyCachinConfiguration -没有帮助

最奇怪的事情是有时我的配置在应用程序启动期间获胜并且一切正常

如何用我的 CustomCacheInterceptor 覆盖默认的 CacheInterceptor

Spring Boot 版本 - 2.0.0.RELEASE

最佳答案

Spring bean 重写是困惑的,应该避免。给定名称的最后一个 bean 定义创建了实际的 bean,但定义之间没有可预测的顺序,因为它取决于多个因素,例如Groovy 与 XML 与 JavaConfig。

从上下文 @ComponentScan 中排除 ProxyCachingConfiguration 配置类并自己重新定义它会更安全,同时提供 CacheInterceptorBeanFactoryCacheOperationSourceAdvisor

如果您的目标只是替换默认 BeanFactoryCacheOperationSourceAdvisor bean 中的建议集,您可以定义一个新的 BeanPostProcessor bean 并在 postProcessBeforeInitialization() 期间调用 setAdvice()

关于java - 自定义 CacheInterceptor 被默认 Spring 的 CacheInterceptor 覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55299059/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com