From 7fd7504fa13a1c433d7018b6fa779968957cf93a Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Fri, 23 Jan 2015 16:26:22 -0700 Subject: [PATCH] only load implementation specific auto config if @ConditionalOnBusEnabled fixes gh-12 --- .../cloud/bus/BusAutoConfiguration.java | 4 +- .../cloud/bus/ConditionalOnBusEnabled.java | 17 +++++ .../cloud/bus/OnBusEnabled.java | 26 +++++++ .../bus/amqp/AmqpBusAutoConfiguration.java | 2 + .../jackson/BusJacksonAutoConfiguration.java | 2 + .../bus/ConditionalOnBusEnabledTests.java | 71 +++++++++++++++++++ .../amqp/AmqpBusAutoConfigurationTests.java | 26 ++++++- 7 files changed, 145 insertions(+), 3 deletions(-) create mode 100644 spring-cloud-bus/src/main/java/org/springframework/cloud/bus/ConditionalOnBusEnabled.java create mode 100644 spring-cloud-bus/src/main/java/org/springframework/cloud/bus/OnBusEnabled.java create mode 100644 spring-cloud-bus/src/test/java/org/springframework/cloud/bus/ConditionalOnBusEnabledTests.java diff --git a/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/BusAutoConfiguration.java b/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/BusAutoConfiguration.java index 66beb00..c0495fc 100644 --- a/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/BusAutoConfiguration.java +++ b/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/BusAutoConfiguration.java @@ -36,9 +36,11 @@ import org.springframework.messaging.SubscribableChannel; * @author Dave Syer */ @Configuration -@ConditionalOnProperty(value = "spring.cloud.bus.enabled", matchIfMissing = true) +@ConditionalOnBusEnabled public class BusAutoConfiguration { + public static final String SPRING_CLOUD_BUS_ENABLED = "spring.cloud.bus.enabled"; + @Autowired private ConfigurableApplicationContext context; diff --git a/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/ConditionalOnBusEnabled.java b/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/ConditionalOnBusEnabled.java new file mode 100644 index 0000000..9cc330e --- /dev/null +++ b/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/ConditionalOnBusEnabled.java @@ -0,0 +1,17 @@ +package org.springframework.cloud.bus; + +import org.springframework.context.annotation.Conditional; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author Spencer Gibb + */ +@Conditional(OnBusEnabled.class) +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.TYPE, ElementType.METHOD }) +public @interface ConditionalOnBusEnabled { +} diff --git a/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/OnBusEnabled.java b/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/OnBusEnabled.java new file mode 100644 index 0000000..d247cb1 --- /dev/null +++ b/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/OnBusEnabled.java @@ -0,0 +1,26 @@ +package org.springframework.cloud.bus; + +import org.springframework.boot.autoconfigure.condition.ConditionOutcome; +import org.springframework.boot.autoconfigure.condition.SpringBootCondition; +import org.springframework.boot.bind.RelaxedPropertyResolver; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.core.type.AnnotatedTypeMetadata; + +import static org.springframework.cloud.bus.BusAutoConfiguration.SPRING_CLOUD_BUS_ENABLED; + +/** + * Match if spring.cloud.bus.enabled is missing or not false + * @author Spencer Gibb + */ +class OnBusEnabled extends SpringBootCondition { + @Override + public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { + RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(context.getEnvironment()); + String enabled = resolver.getProperty(SPRING_CLOUD_BUS_ENABLED); + + if (!"false".equalsIgnoreCase(enabled)) { + return ConditionOutcome.match(); + } + return ConditionOutcome.noMatch(SPRING_CLOUD_BUS_ENABLED + " is " + enabled); + } +} diff --git a/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/amqp/AmqpBusAutoConfiguration.java b/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/amqp/AmqpBusAutoConfiguration.java index ab45a2a..e1c5d5c 100644 --- a/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/amqp/AmqpBusAutoConfiguration.java +++ b/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/amqp/AmqpBusAutoConfiguration.java @@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.bus.ConditionalOnBusEnabled; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.integration.dsl.IntegrationFlow; @@ -23,6 +24,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; * @author Spencer Gibb */ @Configuration +@ConditionalOnBusEnabled @ConditionalOnClass(AmqpTemplate.class) @ConditionalOnProperty(value = "spring.cloud.bus.amqp.enabled", matchIfMissing = true) public class AmqpBusAutoConfiguration { diff --git a/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/jackson/BusJacksonAutoConfiguration.java b/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/jackson/BusJacksonAutoConfiguration.java index 0825efe..09ad1a9 100644 --- a/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/jackson/BusJacksonAutoConfiguration.java +++ b/spring-cloud-bus/src/main/java/org/springframework/cloud/bus/jackson/BusJacksonAutoConfiguration.java @@ -3,6 +3,7 @@ package org.springframework.cloud.bus.jackson; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.cloud.bus.BusAutoConfiguration; +import org.springframework.cloud.bus.ConditionalOnBusEnabled; import org.springframework.cloud.bus.endpoint.RefreshBusEndpoint; import org.springframework.cloud.bus.event.EnvironmentChangeRemoteApplicationEvent; import org.springframework.cloud.bus.event.RefreshRemoteApplicationEvent; @@ -15,6 +16,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; * @author Spencer Gibb */ @Configuration +@ConditionalOnBusEnabled @ConditionalOnClass({ RefreshBusEndpoint.class, ObjectMapper.class }) @AutoConfigureAfter(BusAutoConfiguration.class) public class BusJacksonAutoConfiguration { diff --git a/spring-cloud-bus/src/test/java/org/springframework/cloud/bus/ConditionalOnBusEnabledTests.java b/spring-cloud-bus/src/test/java/org/springframework/cloud/bus/ConditionalOnBusEnabledTests.java new file mode 100644 index 0000000..0536418 --- /dev/null +++ b/spring-cloud-bus/src/test/java/org/springframework/cloud/bus/ConditionalOnBusEnabledTests.java @@ -0,0 +1,71 @@ +package org.springframework.cloud.bus; + +import org.junit.After; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.springframework.boot.test.EnvironmentTestUtils; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.springframework.cloud.bus.BusAutoConfiguration.SPRING_CLOUD_BUS_ENABLED; + +/** + * @author Spencer Gibb + */ +public class ConditionalOnBusEnabledTests { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + private AnnotationConfigApplicationContext context; + + @After + public void tearDown() { + if (this.context != null) { + this.context.close(); + } + } + + @Test + public void busEnabledTrue() { + load(MyBusEnabledConfig.class, SPRING_CLOUD_BUS_ENABLED+":true"); + assertTrue("missing bean from @ConditionalOnBusEnabled config", + this.context.containsBean("foo")); + } + + @Test + public void busEnabledMissing() { + load(MyBusEnabledConfig.class); + assertTrue("missing bean from @ConditionalOnBusEnabled config", + this.context.containsBean("foo")); + } + + @Test + public void busDisabled() { + load(MyBusEnabledConfig.class, SPRING_CLOUD_BUS_ENABLED+":false"); + assertFalse("bean exists from disabled @ConditionalOnBusEnabled config", + this.context.containsBean("foo")); + } + + @Configuration + @ConditionalOnBusEnabled + protected static class MyBusEnabledConfig { + + @Bean + public String foo() { + return "foo"; + } + + } + + private void load(Class config, String... environment) { + this.context = new AnnotationConfigApplicationContext(); + EnvironmentTestUtils.addEnvironment(this.context, environment); + this.context.register(config); + this.context.refresh(); + } +} diff --git a/spring-cloud-bus/src/test/java/org/springframework/cloud/bus/amqp/AmqpBusAutoConfigurationTests.java b/spring-cloud-bus/src/test/java/org/springframework/cloud/bus/amqp/AmqpBusAutoConfigurationTests.java index 2731cce..3256078 100644 --- a/spring-cloud-bus/src/test/java/org/springframework/cloud/bus/amqp/AmqpBusAutoConfigurationTests.java +++ b/spring-cloud-bus/src/test/java/org/springframework/cloud/bus/amqp/AmqpBusAutoConfigurationTests.java @@ -3,9 +3,14 @@ package org.springframework.cloud.bus.amqp; import org.junit.Test; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; +import org.springframework.boot.test.EnvironmentTestUtils; import org.springframework.cloud.bus.BusAutoConfiguration; import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.springframework.cloud.bus.BusAutoConfiguration.SPRING_CLOUD_BUS_ENABLED; + /** * @author Dave Syer */ @@ -14,8 +19,25 @@ public class AmqpBusAutoConfigurationTests { @Test public void contextStarts() throws Exception { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( - AmqpBusAutoConfiguration.class, RabbitAutoConfiguration.class, - PropertyPlaceholderAutoConfiguration.class, BusAutoConfiguration.class); + getConfigClasses()); + assertTrue(context.containsBean("cloudBusExchange")); context.close(); } + + @Test + public void notStartedIfBusDisabled() { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + EnvironmentTestUtils.addEnvironment(context, SPRING_CLOUD_BUS_ENABLED+":false"); + context.register(getConfigClasses()); + context.refresh(); + + assertFalse(context.containsBean("cloudBusExchange")); + + context.close(); + } + + private Class[] getConfigClasses() { + return new Class[]{AmqpBusAutoConfiguration.class, RabbitAutoConfiguration.class, + PropertyPlaceholderAutoConfiguration.class, BusAutoConfiguration.class}; + } }