如何在Spring Java配置中创建Jcache?

时间:2016-01-15 11:14:17

标签: java spring spring-cache jcache caffeine

使用spring cache abstraction设置jcache时遇到问题。

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean(name = "caffeineCachingProvider")
    public CachingProvider caffeineCachingProvider() {
        return new CaffeineCachingProvider();
    }

    @Bean(name = "caffeineCacheManager")
    public JCacheCacheManager getSpringCacheManager() {
        CacheManager cacheManager = caffeineCachingProvider().getCacheManager();
        CaffeineConfiguration<String, List<Product>> caffeineConfiguration = new CaffeineConfiguration<>();
        caffeineConfiguration.setExpiryPolicyFactory(FactoryBuilder.factoryOf(new AccessedExpiryPolicy(new Duration(TimeUnit.MINUTES, 60))));
        Cache<String, List<Product>> productCache = cacheManager.createCache("productCache", caffeineConfiguration);

        JCacheCacheManager jCacheCacheManager = new JCacheCacheManager(cacheManager);
        return jCacheCacheManager;
    }

} 

我使用Caffein作为Jcache。我无法理解我做错了什么。你能解释一下如何正确地做到这一点吗?

我在第NPE行<{1}}获得了什么

cacheManager.createCache(...)

1 个答案:

答案 0 :(得分:3)

详细了解Caffeine配置。其JCache适配器使用默认规范(JCache)设置,该设置指出条目永不过期并按值存储(从缓存中放入/检索时复制)。 (reference here)。

当缓存设置为复制实例时,您应该选择足够的Copier来处理它。所以你可以写:

caffeineConfiguration.setCopierFactory(JavaSerializationCopier::new);

caffeineConfiguration.setCopierFactory(Copier::identity);

这取决于您是否希望在缓存键/值突变的情况下是安全的。

然而,推荐选项使用default settings,其中store-by-value选项已停用且复印机是必需的:

Config config = ConfigFactory.load();
CaffeineConfiguration<String, List<Product>> caffeineConfiguration = TypesafeConfigurator.defaults(config);
caffeineConfiguration.setExpiryPolicyFactory(factoryOf(new AccessedExpiryPolicy(new Duration(
            TimeUnit.MINUTES, 60))));

或者,您可以通过以下方式禁用store-by-value设置:

caffeineConfiguration.setStoreByValue(false);