【问题标题】:How to get CaffeineCacheManager from application context in SpringBoot?如何从 SpringBoot 的应用程序上下文中获取 CaffeineCacheManager?
【发布时间】: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


    【解决方案1】:

    我没有找到注入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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多