diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionalOnBean.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionalOnBean.java index 572500c136..4640d6033f 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionalOnBean.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionalOnBean.java @@ -46,6 +46,13 @@ public @interface ConditionalOnBean { */ Class[] value() default {}; + /** + * The class type names of bean that should be checked. The condition matches when any + * of the classes specified is contained in the {@link ApplicationContext}. + * @return the class type names of beans to check + */ + String[] type() default {}; + /** * The annotation type decorating a bean that should be checked. The condition matches * when each class specified is missing from beans in the {@link ApplicationContext}. diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBean.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBean.java index a2ef542ffb..30df19a48f 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBean.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBean.java @@ -46,6 +46,13 @@ public @interface ConditionalOnMissingBean { */ Class[] value() default {}; + /** + * The class type names of bean that should be checked. The condition matches when + * each class specified is missing in the {@link ApplicationContext}. + * @return the class type names of beans to check + */ + String[] type() default {}; + /** * The annotation type decorating a bean that should be checked. The condition matches * when each class specified is missing from all beans in the diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java index b4d30d164e..805bd24f69 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java @@ -290,6 +290,7 @@ class OnBeanCondition extends SpringBootCondition implements ConfigurationCondit .getAllAnnotationAttributes(annotationType.getName(), true); collect(attributes, "name", this.names); collect(attributes, "value", this.types); + collect(attributes, "type", this.types); collect(attributes, "annotation", this.annotations); if (this.types.isEmpty() && this.names.isEmpty()) { addDeducedBeanType(context, metadata, this.types); diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnBeanTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnBeanTests.java index 47be4935e6..4891a2b01a 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnBeanTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnBeanTests.java @@ -76,6 +76,14 @@ public class ConditionalOnBeanTests { assertEquals("bar", this.context.getBean("bar")); } + @Test + public void testClassOnBeanClassNameCondition() { + this.context.register(FooConfiguration.class, OnBeanClassNameConfiguration.class); + this.context.refresh(); + assertTrue(this.context.containsBean("bar")); + assertEquals("bar", this.context.getBean("bar")); + } + @Test public void testOnBeanConditionWithXml() { this.context.register(XmlConfiguration.class, OnBeanNameConfiguration.class); @@ -100,6 +108,14 @@ public class ConditionalOnBeanTests { assertEquals("bar", this.context.getBean("bar")); } + @Test + public void testOnMissingBeanType() throws Exception { + this.context.register(FooConfiguration.class, + OnBeanMissingClassConfiguration.class); + this.context.refresh(); + assertFalse(this.context.containsBean("bar")); + } + @Configuration @ConditionalOnBean(name = "foo") protected static class OnBeanNameConfiguration { @@ -136,6 +152,24 @@ public class ConditionalOnBeanTests { } } + @Configuration + @ConditionalOnBean(type = "java.lang.String") + protected static class OnBeanClassNameConfiguration { + @Bean + public String bar() { + return "bar"; + } + } + + @Configuration + @ConditionalOnBean(type = "some.type.Missing") + protected static class OnBeanMissingClassConfiguration { + @Bean + public String bar() { + return "bar"; + } + } + @Configuration @EnableScheduling protected static class FooConfiguration {