如何使用@EnableCache,多个CacheManager和一个自定义缓存解析器

时间:2019-07-11 09:29:20

标签: spring spring-cache

我正在尝试使用两个Caffeine CacheManager,一个默认名称,一个命名为(“ new.kid”)。 命名的名称用于类NewKid中的特定方法,并由方法上的@Cacheable(cacheManager =“ new.kid”)指定(不能更改注释设置以解决此问题)。

我已经定义了一个自定义CacheResolver,重写了getCacheNames,以便它为类型为NewKid的目标返回new.kid缓存管理器缓存名称,否则返回defautl缓存名称。

实际上没有很多信息,但是从我收集的信息来看,如果一个具有多个(默认)CacheManager,则必须使用自定义CacheResolver。 我定义了一个自定义CacheResolver,重写了getCacheNames,以便它为类型为NewKid的目标返回new.kid缓存管理器缓存名称,否则返回默认的缓存管理器名称。 完整示例(从Spring Caching入门指南复制和修改)可以在我的github https://github.com/tyonchev/spring-cache

中找到。
NaN

    @Component
    public class NewKid {
        @Cacheable(cacheManager="new.kid")
        public String whatsYourName(String input){
            return "New Kid Name " + input;
        }
    }


    @Configuration
    public class NewKidCacheManager {
        @Bean("new.kid")
        public CacheManager newKidCacheManager() {
            CacheManager cmgr = new CaffeineCacheManager();
            ((CaffeineCacheManager) cmgr).setCacheNames(Arrays.asList(cacheName));
            ((CaffeineCacheManager) cmgr).setCaffeine(Caffeine.newBuilder());
            return cmgr;
        }
    }

    @Configuration
    @EnableCaching
    public class CacheManagerConfig extends CachingConfigurerSupport {
        @Autowired
        @Qualifier(value = "new.kid")
        CacheManager newKidCacheManager;

        @Bean
        @Override
        public CacheManager cacheManager() {
    ...
        }

        @Bean
        @Primary
        @Override
        public CacheResolver cacheResolver( ) {
            return new CustomResolver(newKidCacheManager);
        }

如果我使用@EnableCaching批注,那么我将停留在SimpleCacheResolver上,尽管使用@Primary @Bean批注,但它会完全忽略我的CustomResolver。 这将导致此异常:


class CustomResolver extends AbstractCacheResolver {

    public CustomResolver(CacheManager newKidCacheManager) {
        this.newKidCacheManager = newKidCacheManager;
    }

    @Override
    protected Collection<String> getCacheNames(CacheOperationInvocationContext<?> cacheOperationInvocationContext) {
        if (cacheOperationInvocationContext.getTarget() instanceof NewKid) {
            return newKidCacheManager.getCacheNames();
        } else {
            return getCacheManager().getCacheNames();
        }
    }
}

如果我删除@EnableCaching,则会加载正确的CustomResolver,但是,当然,@Cacheable完全被忽略,因此不会缓存方法结果

我做错了什么,还是不能同时使用EnableCaching和多个带有自定义解析器的CaceManager?即使我有另一个标记为@Primary的CacheResolver Bean,我也总是被SimpleCacheResolver困扰? 如果有人能指出正确的方向,我会很高兴

0 个答案:

没有答案