【发布时间】:2020-07-16 08:57:29
【问题描述】:
我想使用自定义WrappingCacheManager 作为CaffeineCacheManager 的装饰器。
当前配置是使用Caffeine.newBuilder()... 命令式创建的,我想使用属性将其替换为声明性版本:
spring.cache.caffeine.spec=maximumSize=500, expireAfterWrite=60s
不幸的是,应用上下文中没有CaffeineCacheManager 类型的bean,因此无法注入并以自然方式包装。
意图:
// now it fails with NoSuchBeanDefinitionException
@Configuration
class CacheConfig1 {
@Bean
CacheManager cacheManager(CaffeineCacheManager caffeineCacheManager) {
return new WrappingCacheManager(caffeineCacheManager);
}
}
当前使用的变体:
@Configuration
class CacheConfig2 {
@Bean
CacheManager cacheManager() {
var cfg = Caffeine.newBuilder().expireAfterWrite(60, TimeUnit.SECONDS).maximumSize(500);
CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
caffeineCacheManager.setCaffeine(cfg);
return new WrappingCacheManager(caffeineCacheManager);
}
}
pom.xml中的依赖片段
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.7.RELEASE</version>
</parent>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
如何将CaffeineCacheManager 注入到一个bean 创建方法中,并能够围绕它创建一个包装器CacheManager?
【问题讨论】:
标签: spring spring-boot caching applicationcontext caffeine