【问题标题】:How to extend default Spring Boot CacheManager configuration如何扩展默认 Spring Boot CacheManager 配置
【发布时间】:2017-09-15 23:40:09
【问题描述】:

我在我的 Web 应用程序中使用 Spring Boot 缓存支持,并将 Caffeine 设置为缓存提供程序。

我的项目中有几个缓存,大部分都有共同的配置,但是对于两个特定的缓存我需要设置不同的参数。

在我的application.properties 我有类似的东西:

spring.cache.cache-names=a-cache,b-cache,c-cache, ...
spring.cache.caffeine.spec=maximumSize=200,expireAfterWrite=3600s

这适用于普通缓存。然后我想用自定义参数扩展这个配置。

This post 解释了如何通过@Configuration 类配置缓存,但是使用这种方法我完全覆盖了通用配置。

我需要的是这样的:

@Configuration
public class CacheConfiguration {

    @Autowired
    private CacheManager cacheManager;

    @Bean
    public CacheManager cacheManager(Ticker ticker) {
        CaffeineCache c1 = new CaffeineCache("my-custom-cache", Caffeine.newBuilder()
                       .expireAfterWrite(10, TimeUnit.MINUTES)
                       .maximumSize(400)
                       .build());

        // ...

        cacheManager.setCaches(Arrays.asList(..., c1, ... )); // here I'd like to add custom caches...
        return cacheManager;
    }

}

但是声明一个新的CacheManager bean,“原始”cacheManager 不是自动装配的...

有没有办法实现我所需要的?

【问题讨论】:

  • 听起来首选的方法是使用multiple cache managers
  • @BenManes 我已经尝试扩展CachingConfigurerSupport 类,但它只是返回一个空CacheManager,对我来说不是很有用。我目前正在尝试配置多个缓存管理器,但是按照这种方法来实现我所需要的似乎有点不知所措......谢谢
  • jcache 配置文件可能会更容易。

标签: java spring spring-boot caffeine


【解决方案1】:

我使用 CompositeCacheManager 来处理这种情况。本质上,我创建了自定义配置的 CaffeineCaches 并将它们放在 SimpleCacheManager 中,然后将 CaffeineCacheManager 与我的默认设置一起使用。我将两个缓存管理器都放入 CompositeCacheManager 中,spring 将首先在我的 SimpleCacheManager 中查找匹配的缓存,如果没有找到,它将在 CaffeineCacheManager 中查找。如果 CaffeineCacheManager 也没有匹配项,它将使用默认设置创建一个新缓存。

@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {

  private static final Logger logger = LoggerFactory.getLogger(CacheConfig.class);

  @Autowired
  private MyCacheProperties myCacheProperties;

  @Bean
  @Override
  public CacheManager cacheManager() {
    // create a custom configured cache for each of the customCacheSpecs in the myCacheProperties
    final List<CaffeineCache> customCaches = myCacheProperties.getCustomCacheSpecs().entrySet().stream()
        .map(entry -> buildCache(entry.getKey(), entry.getValue()))
        .collect(Collectors.toList());
    // put the custom caches in a SimpleCacheManager
    final SimpleCacheManager simpleCacheManager = new SimpleCacheManager();
    simpleCacheManager.setCaches(customCaches);

    // create a Caffeine Cache manager based on the defaultCacheSpec in the myCacheProperties
    final CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
    caffeineCacheManager.setCacheSpecification(myCacheProperties.getDefaultCacheSpec());
    caffeineCacheManager.setAllowNullValues(false);

    // create a CompositeCacheManager which will first look for a customized cache from the simpleCacheManager and then
    // if no cache is found it will delegate to the caffeineCacheManager.  If the caffeineCacheManager already has
    // created an appropriate cache it will be used, other wise it will create a new cache with the default
    // settings
    final CompositeCacheManager compositeCacheManager = new CompositeCacheManager(simpleCacheManager,
        caffeineCacheManager);
    return compositeCacheManager;
  }

  private CaffeineCache buildCache(final String name, final String cacheSpec) {
    final CaffeineCache caffeineCache = new CaffeineCache(name, Caffeine.from(cacheSpec)
        .build());
    logger.debug("created custom cache: name='{}', and spec='{}'", name, cacheSpec);
    return caffeineCache;
  }
}

感谢https://medium.com/@d.lopez.j/configuring-multiple-ttl-caches-in-spring-boot-dinamically-75f4aa6809f3 的启发

【讨论】:

    猜你喜欢
    • 2020-11-14
    • 2020-12-12
    • 1970-01-01
    • 2021-04-17
    • 2016-06-06
    • 1970-01-01
    • 2017-01-29
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多