Java 无法将Spring缓存建议添加到方法-internalCacheAdvisor与可缓存带注释的bean在同一批中创建

Java 无法将Spring缓存建议添加到方法-internalCacheAdvisor与可缓存带注释的bean在同一批中创建,java,spring,spring-annotations,spring-cache,Java,Spring,Spring Annotations,Spring Cache,我们已经重构了应用程序的某些部分,之后,使用SpringCachable注释的方法停止了缓存,尽管没有触及包含缓存方法的类 经过一些调试之后,我们可以看到,在重构和添加一些新的Springbean之后,现在在internalCacheAdvisor本身所在的同一批中创建了具有Cacable方法的bean。因此,无法应用该建议,并且永远不会调用Spring缓存特性。因此方法结果未缓存,@Cachable注释不起作用 什么机制决定可以同时创建哪些bean,以及如何调试和影响此机制? 我已经查看了Sp

我们已经重构了应用程序的某些部分,之后,使用SpringCachable注释的方法停止了缓存,尽管没有触及包含缓存方法的类

经过一些调试之后,我们可以看到,在重构和添加一些新的Springbean之后,现在在internalCacheAdvisor本身所在的同一批中创建了具有Cacable方法的bean。因此,无法应用该建议,并且永远不会调用Spring缓存特性。因此方法结果未缓存,@Cachable注释不起作用

什么机制决定可以同时创建哪些bean,以及如何调试和影响此机制?

我已经查看了Spring方法BeanFactoryAdvisorRetrievalHelper::FindVisorBeans,在运行旧代码和worikng代码时,它是这样的:

重构后,它看起来如下所示:

我们的注释类CouchBaseTransationProvider与internalCacheAdvisor在同一批中创建,这是不可能的。当尝试应用建议代理时,我收到一条调试消息“跳过当前创建的顾问…”。(我认为这应该是一条错误消息!)

启用缓存的POM文件如下所示:

@Configuration
@EnableWebMvc
@ComponentScan({"[package]", "[package].connectors"})
@Import({EventsConfig.class,
        CmsConfig.class})
@EnableCaching
public class ApiConfig {

    public static class Caches{
        public static final String SPORTS = "sports";
        [...]
        public static final String PIPEDTRANSLATIONS = "translations";
    }

    @Value("${[package].document}")
    private String someUrl;

    @Bean
    public CouchbaseClient getCouchbaseClient() throws IOException {
        [code]
    }

    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        cacheManager.setCaches(Arrays.asList(new ConcurrentMapCache(Caches.SPORTS),
                [...],
                new ConcurrentMapCache(Caches.PIPEDTRANSLATIONS)));
        return cacheManager;
    }

    @Autowired
    private EventUpdateGate eventUpdateGate;

    @Bean
    @ConditionalOnProperty("AdapterGate.events.active")
    public AdapterGateReceiver eventAdapterGateReceiver(@Value("${AdapterGate.events.gateChannel}") String channel,
                                                @Value("${AdapterGate.events.apiVersion}") String version) {
        return new AdapterGateReceiver(channel, version, eventUpdateGate);
    }
}

您是否有可能在配置类中注入
CouchBaseTransationProvider
?那个班有什么奇怪的配置安排吗?它在另一门课上有用吗?是的,实际上我是。。。我以前没见过这个。重构之后,引入了EventUpdateGate。这个bean注入另一个bean,该bean注入另一个bean,该bean注入CouchBaseTransationProvider。现在我已经测试过将EventUpdateGate(和AdapterGaterReceiver)移动到它自己的配置文件中,问题现在解决了,谢谢!很酷,很高兴有帮助。具有讽刺意味的是,我们收到了一份与您类似的报告,这导致我认为,要么在日志中打印错误,要么甚至在此处抛出“循环引用”异常,都是合理的。如果没有日志上的调试级别,您得到的关于未命中配置的唯一指示是(某些)缓存注释的方法不再被缓存,并且您的应用程序运行稍慢。当然,这可能有我不知道的副作用,并且异常将不向后兼容,但可能需要添加一个错误日志。在信息级别已经有一个日志告诉您bean不适合代理,但我明白您的意思。4.1.2应修复该问题,但在配置类中注入组件时应始终小心。