From 58397583653337ce9a28cd7b7588ec804375d8db Mon Sep 17 00:00:00 2001 From: Olga Maciaszek-Sharma Date: Tue, 26 Jan 2021 17:37:44 +0100 Subject: [PATCH] Add CaffeineCacheManager class conditions to LoadBalancerCacheAutoConfiguration. (#891) --- .../LoadBalancerCacheAutoConfiguration.java | 28 ++++++++++++++++--- ...adBalancerCacheAutoConfigurationTests.java | 23 +++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/config/LoadBalancerCacheAutoConfiguration.java b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/config/LoadBalancerCacheAutoConfiguration.java index 91848859..09154138 100644 --- a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/config/LoadBalancerCacheAutoConfiguration.java +++ b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/config/LoadBalancerCacheAutoConfiguration.java @@ -25,12 +25,14 @@ import org.apache.commons.logging.LogFactory; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.AnyNestedCondition; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cache.CacheManager; +import org.springframework.cache.caffeine.CaffeineCacheManager; import org.springframework.cache.interceptor.CacheAspectSupport; import org.springframework.cloud.client.loadbalancer.reactive.OnNoRibbonDefaultCondition; import org.springframework.cloud.loadbalancer.cache.CaffeineBasedLoadBalancerCacheManager; @@ -63,7 +65,7 @@ import org.springframework.context.annotation.Configuration; public class LoadBalancerCacheAutoConfiguration { @Configuration(proxyBeanMethods = false) - @ConditionalOnMissingClass("com.github.benmanes.caffeine.cache.Caffeine") + @Conditional(OnCaffeineCacheMissingCondition.class) protected static class LoadBalancerCacheManagerWarnConfiguration { @Bean @@ -83,14 +85,14 @@ public class LoadBalancerCacheAutoConfiguration { if (LOG.isWarnEnabled()) { LOG.warn( "Spring Cloud LoadBalancer is currently working with the default cache. " - + "You can switch to using Caffeine cache, by adding it to the classpath."); + + "You can switch to using Caffeine cache, by adding it and org.springframework.cache.caffeine.CaffeineCacheManager to the classpath."); } } } @Configuration(proxyBeanMethods = false) - @ConditionalOnClass(Caffeine.class) + @ConditionalOnClass({ Caffeine.class, CaffeineCacheManager.class }) protected static class CaffeineLoadBalancerCacheManagerConfiguration { @Bean(autowireCandidate = false) @@ -103,7 +105,7 @@ public class LoadBalancerCacheAutoConfiguration { } @Configuration(proxyBeanMethods = false) - @ConditionalOnMissingClass("com.github.benmanes.caffeine.cache.Caffeine") + @Conditional(OnCaffeineCacheMissingCondition.class) @ConditionalOnClass(ConcurrentMapWithTimedEviction.class) protected static class DefaultLoadBalancerCacheManagerConfiguration { @@ -116,4 +118,22 @@ public class LoadBalancerCacheAutoConfiguration { } + static final class OnCaffeineCacheMissingCondition extends AnyNestedCondition { + + private OnCaffeineCacheMissingCondition() { + super(ConfigurationPhase.REGISTER_BEAN); + } + + @ConditionalOnMissingClass("com.github.benmanes.caffeine.cache.Caffeine") + static class CaffeineClassMissing { + + } + + @ConditionalOnMissingClass("org.springframework.cache.caffeine.CaffeineCacheManager") + static class CaffeineCacheManagerClassMissing { + + } + + } + } diff --git a/spring-cloud-loadbalancer/src/test/java/org/springframework/cloud/loadbalancer/config/LoadBalancerCacheAutoConfigurationTests.java b/spring-cloud-loadbalancer/src/test/java/org/springframework/cloud/loadbalancer/config/LoadBalancerCacheAutoConfigurationTests.java index 2bc44f67..0395da53 100644 --- a/spring-cloud-loadbalancer/src/test/java/org/springframework/cloud/loadbalancer/config/LoadBalancerCacheAutoConfigurationTests.java +++ b/spring-cloud-loadbalancer/src/test/java/org/springframework/cloud/loadbalancer/config/LoadBalancerCacheAutoConfigurationTests.java @@ -130,6 +130,24 @@ class LoadBalancerCacheAutoConfigurationTests { }); } + @Test + void shouldUseDefaultCacheIfCaffeineCacheManagerNotInClasspath() { + ApplicationContextRunner contextRunner = noCaffeineCacheManagerRunner(); + + contextRunner.run(context -> { + assertThat(context.getBean( + LoadBalancerCacheAutoConfiguration.LoadBalancerCaffeineWarnLogger.class)) + .isNotNull(); + assertThat(context.getBeansOfType(CacheManager.class)).hasSize(1); + assertThat(((CacheManager) context.getBean("defaultLoadBalancerCacheManager")) + .getCacheNames()).hasSize(1); + assertThat(context.getBean("defaultLoadBalancerCacheManager")) + .isInstanceOf(DefaultLoadBalancerCacheManager.class); + assertThat(((CacheManager) context.getBean("defaultLoadBalancerCacheManager")) + .getCacheNames()).contains("CachingServiceInstanceListSupplierCache"); + }); + } + @Test void defaultLoadBalancerCacheShouldNotOverrideCacheTypeSetting() { ApplicationContextRunner contextRunner = noCaffeineRunner() @@ -190,6 +208,11 @@ class LoadBalancerCacheAutoConfigurationTests { .withClassLoader(new FilteredClassLoader(Caffeine.class)); } + private ApplicationContextRunner noCaffeineCacheManagerRunner() { + return baseApplicationRunner() + .withClassLoader(new FilteredClassLoader(CaffeineCacheManager.class)); + } + @Configuration(proxyBeanMethods = false) @EnableCaching static class TestConfiguration {