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 af4a58b4..8af08a6c 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 @@ -29,7 +29,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.client.loadbalancer.AsyncLoadBalancerAutoConfiguration; -import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient; import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; @@ -60,14 +59,19 @@ public class BlockingLoadBalancerClientAutoConfiguration { return new RibbonWarnLogger(); } - @Bean - @ConditionalOnBean(LoadBalancerClientFactory.class) + @Configuration @ConditionalOnClass(RestTemplate.class) @Conditional(OnNoRibbonDefaultCondition.class) - @Primary - public LoadBalancerClient blockingLoadBalancerClient( - LoadBalancerClientFactory loadBalancerClientFactory) { - return new BlockingLoadBalancerClient(loadBalancerClientFactory); + protected static class BlockingLoadbalancerClientConfig { + + @Bean + @ConditionalOnBean(LoadBalancerClientFactory.class) + @Primary + public BlockingLoadBalancerClient blockingLoadBalancerClient( + LoadBalancerClientFactory loadBalancerClientFactory) { + return new BlockingLoadBalancerClient(loadBalancerClientFactory); + } + } private static final class OnNoRibbonDefaultCondition extends AnyNestedCondition { @@ -89,21 +93,21 @@ public class BlockingLoadBalancerClientAutoConfiguration { } -} + static class RibbonWarnLogger { -class RibbonWarnLogger { + private static final Log LOG = LogFactory.getLog(RibbonWarnLogger.class); - private static final Log LOG = LogFactory.getLog(RibbonWarnLogger.class); - - @PostConstruct - void logWarning() { - if (LOG.isWarnEnabled()) { - LOG.warn( - "You already have RibbonLoadBalancerClient on your classpath. It will be used by default. To use " - + BlockingLoadBalancerClient.class.getSimpleName() - + " set the value of `spring.cloud.loadbalancer.ribbon.enabled` to `false` or " - + "remove spring-cloud-starter-netflix-ribbon from your project."); + @PostConstruct + void logWarning() { + if (LOG.isWarnEnabled()) { + LOG.warn( + "You already have RibbonLoadBalancerClient on your classpath. It will be used by default. To use " + + BlockingLoadBalancerClient.class.getSimpleName() + + " set the value of `spring.cloud.loadbalancer.ribbon.enabled` to `false` or " + + "remove spring-cloud-starter-netflix-ribbon from your project."); + } } + } } 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 new file mode 100644 index 00000000..70aaa95d --- /dev/null +++ b/spring-cloud-loadbalancer/src/test/java/org/springframework/cloud/loadbalancer/config/BlockingLoadBalancerClientAutoConfigurationTests.java @@ -0,0 +1,61 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.loadbalancer.config; + +import org.junit.Test; + +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.FilteredClassLoader; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient; +import org.springframework.cloud.loadbalancer.config.BlockingLoadBalancerClientAutoConfiguration.RibbonWarnLogger; +import org.springframework.web.client.RestTemplate; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Spencer Gibb + * @author Olga Maciaszek-Sharma + * @author Tim Ysewyn + */ +public class BlockingLoadBalancerClientAutoConfigurationTests { + + ApplicationContextRunner applicationContextRunner = new ApplicationContextRunner() + .withPropertyValues("spring.cloud.loadbalancer.ribbon.enabled=false", + "debug=true") + .withConfiguration(AutoConfigurations.of(LoadBalancerAutoConfiguration.class, + BlockingLoadBalancerClientAutoConfiguration.class)); + + @Test + public void beansCreatedNormally() { + applicationContextRunner.run(ctxt -> { + assertThat(ctxt).hasSingleBean(BlockingLoadBalancerClient.class); + assertThat(ctxt).doesNotHaveBean(RibbonWarnLogger.class); + }); + } + + @Test + public void worksWithoutSpringWeb() { + applicationContextRunner + .withClassLoader(new FilteredClassLoader(RestTemplate.class)) + .run(context -> { + assertThat(context).doesNotHaveBean(BlockingLoadBalancerClient.class); + assertThat(context).doesNotHaveBean(RibbonWarnLogger.class); + }); + } + +}