0

我们重构了应用程序的某些部分,之后,虽然没有触及包含缓存方法的类,但使用 spring cachable 注释的方法停止被缓存。

经过一些调试,我们可以看到在重构并添加了一些新的 Spring bean 之后,具有 cachable 方法的 bean 现在与 internalCacheAdvisor 本身在同一批次中创建。因此无法应用 Advice,并且永远不会调用 Spring 缓存方面。所以方法结果没有被缓存,@Cachable注解不起作用。

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

我查看了 Spring 方法 BeanFactoryAdvisorRetrievalHelper::findAdvisorBeans,在运行旧代码和工作代码时,它看起来像这样: 成功创建的可缓存 bean

重构之后是这样的: 在此处输入图像描述

我们的注解类 couchbaseTranslationProvider 与 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);
    }
}
4

0 回答 0