From 652ab2147e09f38d11d328ca8273931f424f11b3 Mon Sep 17 00:00:00 2001 From: amuthmann Date: Sat, 18 Aug 2018 15:32:30 +0200 Subject: [PATCH] CaffeineCacheManager: Allow custom cache configuration by name --- .../cache/caffeine/CaffeineCacheManager.java | 67 ++++++++++++++++--- 1 file changed, 58 insertions(+), 9 deletions(-) diff --git a/spring-context-support/src/main/java/org/springframework/cache/caffeine/CaffeineCacheManager.java b/spring-context-support/src/main/java/org/springframework/cache/caffeine/CaffeineCacheManager.java index bf0ec1ff4cce..63cf9b241152 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/caffeine/CaffeineCacheManager.java +++ b/spring-context-support/src/main/java/org/springframework/cache/caffeine/CaffeineCacheManager.java @@ -32,6 +32,7 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; /** * {@link CacheManager} implementation that lazily builds {@link CaffeineCache} @@ -59,7 +60,9 @@ public class CaffeineCacheManager implements CacheManager { private boolean dynamic = true; - private Caffeine cacheBuilder = Caffeine.newBuilder(); + private final ConcurrentMap cacheBuilder = new ConcurrentHashMap<>(16); + + private Caffeine defaultCacheBuilder = Caffeine.newBuilder(); @Nullable private CacheLoader cacheLoader; @@ -109,8 +112,18 @@ public void setCacheNames(@Nullable Collection cacheNames) { * @see com.github.benmanes.caffeine.cache.Caffeine#build() */ public void setCaffeine(Caffeine caffeine) { + setCaffeine(null, caffeine); + } + + /** + * Set the Caffeine to use for building the + * {@link CaffeineCache} instance with the given name. + * @see #createNativeCaffeineCache + * @see com.github.benmanes.caffeine.cache.Caffeine#build() + */ + public void setCaffeine(String name, Caffeine caffeine) { Assert.notNull(caffeine, "Caffeine must not be null"); - doSetCaffeine(caffeine); + doSetCaffeine(name, caffeine); } /** @@ -120,7 +133,17 @@ public void setCaffeine(Caffeine caffeine) { * @see com.github.benmanes.caffeine.cache.Caffeine#from(CaffeineSpec) */ public void setCaffeineSpec(CaffeineSpec caffeineSpec) { - doSetCaffeine(Caffeine.from(caffeineSpec)); + setCaffeineSpec(null, caffeineSpec); + } + + /** + * Set the {@link CaffeineSpec} to use for building the + * {@link CaffeineCache} instance with the given name. + * @see #createNativeCaffeineCache + * @see com.github.benmanes.caffeine.cache.Caffeine#from(CaffeineSpec) + */ + public void setCaffeineSpec(String name, CaffeineSpec caffeineSpec) { + doSetCaffeine(name, Caffeine.from(caffeineSpec)); } /** @@ -131,7 +154,18 @@ public void setCaffeineSpec(CaffeineSpec caffeineSpec) { * @see com.github.benmanes.caffeine.cache.Caffeine#from(String) */ public void setCacheSpecification(String cacheSpecification) { - doSetCaffeine(Caffeine.from(cacheSpecification)); + setCacheSpecification(null, cacheSpecification); + } + + /** + * Set the Caffeine cache specification String to use for building the + * {@link CaffeineCache} instance with the given name. The given value needs to + * comply with Caffeine's {@link CaffeineSpec} (see its javadoc). + * @see #createNativeCaffeineCache + * @see com.github.benmanes.caffeine.cache.Caffeine#from(String) + */ + public void setCacheSpecification(String name, String cacheSpecification) { + doSetCaffeine(name, Caffeine.from(cacheSpecification)); } /** @@ -206,17 +240,32 @@ protected Cache createCaffeineCache(String name) { * @return the native Caffeine Cache instance */ protected com.github.benmanes.caffeine.cache.Cache createNativeCaffeineCache(String name) { + if(cacheBuilder.containsKey(name)){ + return createNativeCaffeineCache(cacheBuilder.get(name)); + } + else{ + return createNativeCaffeineCache(defaultCacheBuilder); + } + } + + private com.github.benmanes.caffeine.cache.Cache createNativeCaffeineCache(Caffeine builder){ if (this.cacheLoader != null) { - return this.cacheBuilder.build(this.cacheLoader); + return builder.build(this.cacheLoader); } else { - return this.cacheBuilder.build(); + return builder.build(); } } - private void doSetCaffeine(Caffeine cacheBuilder) { - if (!ObjectUtils.nullSafeEquals(this.cacheBuilder, cacheBuilder)) { - this.cacheBuilder = cacheBuilder; + private void doSetCaffeine(String name, Caffeine cacheBuilder) { + if(StringUtils.isEmpty(name)){ + if (!ObjectUtils.nullSafeEquals(this.defaultCacheBuilder, cacheBuilder)) { + this.defaultCacheBuilder = cacheBuilder; + refreshKnownCaches(); + } + } + else if(!ObjectUtils.nullSafeEquals(this.cacheBuilder.get(name), cacheBuilder)) { + this.cacheBuilder.put(name, cacheBuilder); refreshKnownCaches(); } }