diff --git a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/config/BlockingLoadBalancerClientAutoConfiguration.java b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/config/BlockingLoadBalancerClientAutoConfiguration.java index 0e231402..bf7fe4ad 100644 --- a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/config/BlockingLoadBalancerClientAutoConfiguration.java +++ b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/config/BlockingLoadBalancerClientAutoConfiguration.java @@ -21,6 +21,7 @@ import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryFactory; @@ -50,6 +51,7 @@ import org.springframework.web.client.RestTemplate; @AutoConfigureAfter(LoadBalancerAutoConfiguration.class) @AutoConfigureBefore({ org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration.class }) @ConditionalOnClass(RestTemplate.class) +@ConditionalOnProperty(value = "spring.cloud.loadbalancer.enabled", havingValue = "true", matchIfMissing = true) public class BlockingLoadBalancerClientAutoConfiguration { @Bean 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 4f20a181..b37ffe53 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 @@ -24,6 +24,7 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.AllNestedConditions; import org.springframework.boot.autoconfigure.condition.AnyNestedCondition; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -42,9 +43,9 @@ import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; /** - * An AutoConfiguration that automatically enables caching when when Spring Boot, and - * Spring Framework Cache support are present. If Caffeine is present in the classpath, it - * will be used for loadbalancer caching. If not, a default cache will be used. + * An AutoConfiguration that automatically enables caching when Spring Boot, and Spring + * Framework Cache support are present. If Caffeine is present in the classpath, it will + * be used for loadbalancer caching. If not, a default cache will be used. * * @author Olga Maciaszek-Sharma * @since 2.2.0 @@ -56,8 +57,8 @@ import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) @ConditionalOnClass({ CacheManager.class, CacheAutoConfiguration.class }) @AutoConfigureAfter(CacheAutoConfiguration.class) -@ConditionalOnProperty(value = "spring.cloud.loadbalancer.cache.enabled", matchIfMissing = true) @EnableConfigurationProperties(LoadBalancerCacheProperties.class) +@Conditional(LoadBalancerCacheAutoConfiguration.OnLoadBalancerCachingEnabledCondition.class) public class LoadBalancerCacheAutoConfiguration { @Configuration(proxyBeanMethods = false) @@ -129,4 +130,22 @@ public class LoadBalancerCacheAutoConfiguration { } + static final class OnLoadBalancerCachingEnabledCondition extends AllNestedConditions { + + OnLoadBalancerCachingEnabledCondition() { + super(ConfigurationPhase.REGISTER_BEAN); + } + + @ConditionalOnProperty(value = "spring.cloud.loadbalancer.enabled", havingValue = "true", matchIfMissing = true) + static class LoadBalancerEnabled { + + } + + @ConditionalOnProperty(value = "spring.cloud.loadbalancer.cache.enabled", matchIfMissing = true) + static class LoadBalancerCacheEnabled { + + } + + } + } diff --git a/spring-cloud-loadbalancer/src/test/java/org/springframework/cloud/loadbalancer/config/BlockingLoadBalancerClientAutoConfigurationTests.java b/spring-cloud-loadbalancer/src/test/java/org/springframework/cloud/loadbalancer/config/BlockingLoadBalancerClientAutoConfigurationTests.java index 9646f2dc..9558d56d 100644 --- a/spring-cloud-loadbalancer/src/test/java/org/springframework/cloud/loadbalancer/config/BlockingLoadBalancerClientAutoConfigurationTests.java +++ b/spring-cloud-loadbalancer/src/test/java/org/springframework/cloud/loadbalancer/config/BlockingLoadBalancerClientAutoConfigurationTests.java @@ -52,4 +52,12 @@ class BlockingLoadBalancerClientAutoConfigurationTests { .run(context -> assertThat(context).doesNotHaveBean(BlockingLoadBalancerClient.class)); } + @Test + void shouldNotFailOnRetryFactoryWhenLoadBalancingDisabled() { + applicationContextRunner.withPropertyValues("spring.cloud.loadbalancer.enabled=false").run(context -> { + assertThat(context).doesNotHaveBean(BlockingLoadBalancerClient.class); + assertThat(context).doesNotHaveBean(LoadBalancedRetryFactory.class); + }); + } + } 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 12066f80..dbcf9f00 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 @@ -171,6 +171,16 @@ class LoadBalancerCacheAutoConfigurationTests { }); } + @Test + void shouldNotInstantiateDefaultLoadBalancerCacheIfLoadBalancingDisabled() { + noCaffeineRunner().withPropertyValues("spring.cloud.loadbalancer.enabled=false") + .withUserConfiguration(TestConfiguration.class).run(context -> { + assertThat(context.getBeansOfType(CacheManager.class)).hasSize(1); + assertThat(context.getBean("cacheManager")).isInstanceOf(ConcurrentMapCacheManager.class); + assertThat(((CacheManager) context.getBean("cacheManager")).getCacheNames()).isEmpty(); + }); + } + private ApplicationContextRunner baseApplicationRunner() { return new ApplicationContextRunner().withConfiguration( AutoConfigurations.of(CacheAutoConfiguration.class, LoadBalancerCacheAutoConfiguration.class));