only load implementation specific auto config if @ConditionalOnBusEnabled

fixes gh-12
This commit is contained in:
Spencer Gibb
2015-01-23 16:26:22 -07:00
parent 04ad7c92c8
commit 7fd7504fa1
7 changed files with 145 additions and 3 deletions

View File

@@ -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;

View File

@@ -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 {
}

View File

@@ -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);
}
}

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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();
}
}

View File

@@ -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};
}
}