如何从 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);
}