diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CaffeineCacheConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CaffeineCacheConfiguration.java index 8ab62b4567df..64e209e00404 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CaffeineCacheConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CaffeineCacheConfiguration.java @@ -53,13 +53,13 @@ class CaffeineCacheConfiguration { private final CaffeineSpec caffeineSpec; - private final CacheLoader cacheLoader; + private final CacheLoader cacheLoader; CaffeineCacheConfiguration(CacheProperties cacheProperties, CacheManagerCustomizers customizers, ObjectProvider> caffeineProvider, ObjectProvider caffeineSpecProvider, - ObjectProvider> cacheLoaderProvider) { + ObjectProvider cacheLoaderProvider) { this.cacheProperties = cacheProperties; this.customizers = customizers; this.caffeine = caffeineProvider.getIfAvailable(); diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cache/CacheAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cache/CacheAutoConfigurationTests.java index 959b2a17b326..1a8552026f05 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cache/CacheAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cache/CacheAutoConfigurationTests.java @@ -23,6 +23,9 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.function.Supplier; import javax.cache.Caching; import javax.cache.configuration.CompleteConfiguration; @@ -34,6 +37,7 @@ import com.couchbase.client.java.bucket.BucketManager; import com.couchbase.client.spring.cache.CouchbaseCache; import com.couchbase.client.spring.cache.CouchbaseCacheManager; +import com.github.benmanes.caffeine.cache.CacheLoader; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.CaffeineSpec; import com.google.common.cache.CacheBuilder; @@ -714,6 +718,21 @@ public void caffeineCacheExplicitWithSpecString() { validateCaffeineCacheWithStats(); } + @Test + @SuppressWarnings("unchecked") + public void caffeineCacheExplicitWithLoader() { + load(CaffeineCacheLoaderConfiguration.class, "spring.cache.type=caffeine", + "spring.cache.cacheNames[0]=foo", "spring.cache.cacheNames[1]=bar", + "spring.cache.caffeine.spec=recordStats"); + validateCaffeineCacheWithStats(); + + CaffeineCacheManager cacheManager = (CaffeineCacheManager) this.context.getBean(CacheManager.class); + Cache.ValueWrapper value = cacheManager.getCache("bar").get("hi"); + assertThat(value).as("Cache miss should be loaded from the provided CacheLoader") + .isNotNull(); + assertThat((List) value.get()).containsExactly("One", "two", "three"); + } + private void validateCaffeineCacheWithStats() { CaffeineCacheManager cacheManager = validateCacheManager( CaffeineCacheManager.class); @@ -1028,6 +1047,35 @@ CaffeineSpec caffeineSpec() { } + @Configuration + @EnableCaching + static class CaffeineCacheLoaderConfiguration { + + @Bean + CacheLoader> cacheLoader() { + return new CacheLoader>() { + @Override + public CompletableFuture> asyncLoad(final String key, Executor executor) { + return CompletableFuture.supplyAsync(new Supplier>() { + @Override + public List get() { + return getValues(key); + } + }, executor); + } + + @Override + public List load(String key) throws Exception { + return getValues(key); + } + }; + } + + private List getValues(String key) { + return Arrays.asList("One", "two", "three"); + } + } + @Configuration static class CacheManagerCustomizersConfiguration {