如何从 SpringBoot 的应用程序上下文中获取 CaffeineCacheManager?
How to get CaffeineCacheManager from application context in SpringBoot?
我想使用自定义 WrappingCacheManager
作为 CaffeineCacheManager
的装饰器。
当前配置是使用 Caffeine.newBuilder()...
命令式创建的,我想使用 属性:
将其替换为声明式版本
spring.cache.caffeine.spec=maximumSize=500, expireAfterWrite=60s
不幸的是,app context 中没有 CaffeineCacheManager
类型的 beans,因此无法以自然方式注入和包装它。
意向:
// 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
?
我没有找到注入 CaffeineCacheManager
的方法,但至少可以使用 Caffeine.from
函数从字符串创建 Caffeine 配置。因此通过 @Value
注入 属性 是一个令人满意的解决方案。
@Bean
public CacheManager cacheManager(
@Value("${spring.cache.caffeine.spec}") String caffeineSpec
) {
var cfg = Caffeine.from(caffeineSpec);
CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
caffeineCacheManager.setCaffeine(cfg);
return new WrappingCacheManager(caffeineCacheManager);
}
我想使用自定义 WrappingCacheManager
作为 CaffeineCacheManager
的装饰器。
当前配置是使用 Caffeine.newBuilder()...
命令式创建的,我想使用 属性:
spring.cache.caffeine.spec=maximumSize=500, expireAfterWrite=60s
不幸的是,app context 中没有 CaffeineCacheManager
类型的 beans,因此无法以自然方式注入和包装它。
意向:
// 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
?
我没有找到注入 CaffeineCacheManager
的方法,但至少可以使用 Caffeine.from
函数从字符串创建 Caffeine 配置。因此通过 @Value
注入 属性 是一个令人满意的解决方案。
@Bean
public CacheManager cacheManager(
@Value("${spring.cache.caffeine.spec}") String caffeineSpec
) {
var cfg = Caffeine.from(caffeineSpec);
CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
caffeineCacheManager.setCaffeine(cfg);
return new WrappingCacheManager(caffeineCacheManager);
}