如何扩展默认的弹簧启动CacheManager配置



我正在使用网络应用程序中的春季启动缓存支持,我将咖啡因设置为缓存提供商。

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

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

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

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

这篇文章说明了如何通过@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不是自动的...

有没有办法实施我需要的东西?

我利用CompositeCacheManager来处理这种情况。从本质上讲,我创建了自定义配置的咖啡因,然后将它们放入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-spring--boot-dinamicaly-75f4aa6809f3

最新更新