我正在开发一个大型 Spring Boot 2.1.5.RELEASE 应用程序,使用 Caffeine 作为缓存提供程序。为了防止 I/O 瓶颈,我LoadingCache<K,V>
以(基本上)以下方式使用咖啡因:
LoadingCache<K, V> cache = Caffeine.newBuilder()
.refreshAfterWrite(1, TimeUnit.MINUTES)
.build(loadStuffOverHttp());
据我所知,如果不使用LoadingCache
.
但是,LoadingCache
没有实现 Spring 的Cache
. 这意味着我不能依赖@Bean
方法来注册我的缓存,每个方法都需要进行不同的配置。理论上,在 Spring 上下文中注册将允许它们与 Spring 的@Cacheable
注释一起使用。
从CaffeineCacheConfiguration.java的源代码中可以看出,我也不能依赖 Spring Boot 的自动配置。类型的 Bean CaffeineCache
(Spring 的Caffeine的缓存适配器模式Cache<K,V>
)是自动注册的,但是适配器强制我将其<Object, Object>
用作 my 的泛型类型CacheLoader<K, V>
。我只想将其作为最后的手段。
这个 SO question表明可以以编程方式配置不同的缓存:
只需将您的自定义缓存公开为 bean。它们会自动添加到
CaffeineCacheManager
.
但是,使用LoadingCache<K, V>
(使用任意K
, V
, not <Object, Object>
)执行此操作似乎更难。
这个 SO question似乎表明使用 aSimpleCacheManager
而不是 aCaffeineCacheManager
是可能的 - 但是使用这个解决方案需要CacheLoader
定义对Cache
bean 可用。这可能很容易首先需要使用缓存注入服务@Cacheable
,例如在昂贵的 HTTP 调用的情况下。这似乎也是一个容易产生依赖循环的解决方案,但如果不是这种情况,请纠正我。
问题
LoadingCache<K, V>
定义用于 Spring 的Caffeine 的正确方法是@Cacheable
什么?