diff --git a/spring-actuator/src/main/java/org/springframework/actuate/autoconfigure/EndpointWebMvcChildContextConfiguration.java b/spring-actuator/src/main/java/org/springframework/actuate/autoconfigure/EndpointWebMvcChildContextConfiguration.java index d6cccea1e4b..f8f3cdd0a5e 100644 --- a/spring-actuator/src/main/java/org/springframework/actuate/autoconfigure/EndpointWebMvcChildContextConfiguration.java +++ b/spring-actuator/src/main/java/org/springframework/actuate/autoconfigure/EndpointWebMvcChildContextConfiguration.java @@ -26,6 +26,7 @@ import org.springframework.beans.factory.HierarchicalBeanFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.bootstrap.context.condition.ConditionalOnBean; import org.springframework.bootstrap.context.condition.ConditionalOnClass; +import org.springframework.bootstrap.context.condition.SearchStrategy; import org.springframework.bootstrap.context.embedded.ConfigurableEmbeddedServletContainerFactory; import org.springframework.bootstrap.context.embedded.EmbeddedServletContainer; import org.springframework.bootstrap.context.embedded.EmbeddedServletContainerCustomizer; @@ -81,7 +82,7 @@ public class EndpointWebMvcChildContextConfiguration implements @Configuration @ConditionalOnClass({ EnableWebSecurity.class, Filter.class }) - @ConditionalOnBean(name = "springSecurityFilterChain", parentOnly = true) + @ConditionalOnBean(name = "springSecurityFilterChain", search = SearchStrategy.PARENTS) public static class EndpointWebMvcChildContextSecurityConfiguration { // FIXME reuse of security filter here is not good. What if totally different diff --git a/spring-autoconfigure/src/main/java/org/springframework/autoconfigure/web/EmbeddedServletContainerAutoConfiguration.java b/spring-autoconfigure/src/main/java/org/springframework/autoconfigure/web/EmbeddedServletContainerAutoConfiguration.java index e27a3371c06..1e117b3ab87 100644 --- a/spring-autoconfigure/src/main/java/org/springframework/autoconfigure/web/EmbeddedServletContainerAutoConfiguration.java +++ b/spring-autoconfigure/src/main/java/org/springframework/autoconfigure/web/EmbeddedServletContainerAutoConfiguration.java @@ -24,6 +24,7 @@ import org.eclipse.jetty.util.Loader; import org.springframework.autoconfigure.EnableAutoConfiguration; import org.springframework.bootstrap.context.condition.ConditionalOnClass; import org.springframework.bootstrap.context.condition.ConditionalOnMissingBean; +import org.springframework.bootstrap.context.condition.SearchStrategy; import org.springframework.bootstrap.context.embedded.EmbeddedServletContainerCustomizer; import org.springframework.bootstrap.context.embedded.EmbeddedServletContainerCustomizerBeanPostProcessor; import org.springframework.bootstrap.context.embedded.EmbeddedServletContainerFactory; @@ -50,7 +51,7 @@ public class EmbeddedServletContainerAutoConfiguration { * {@link EmbeddedServletContainerCustomizer}s. */ @Bean - @ConditionalOnMissingBean(value = EmbeddedServletContainerCustomizerBeanPostProcessor.class, parentContext = false) + @ConditionalOnMissingBean(value = EmbeddedServletContainerCustomizerBeanPostProcessor.class, search = SearchStrategy.CURRENT) public EmbeddedServletContainerCustomizerBeanPostProcessor embeddedServletContainerCustomizerBeanPostProcessor() { return new EmbeddedServletContainerCustomizerBeanPostProcessor(); } @@ -64,7 +65,7 @@ public class EmbeddedServletContainerAutoConfiguration { @Bean @ConditionalOnMissingBean(value = { ServletContextInitializer.class, - Servlet.class }, parentContext = false) + Servlet.class }, search = SearchStrategy.CURRENT) public DispatcherServlet dispatcherServlet() { return new DispatcherServlet(); } @@ -75,7 +76,7 @@ public class EmbeddedServletContainerAutoConfiguration { */ @Configuration @ConditionalOnClass({ Servlet.class, Tomcat.class }) - @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, parentContext = false) + @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT) public static class EmbeddedTomcat { @Bean @@ -90,7 +91,7 @@ public class EmbeddedServletContainerAutoConfiguration { */ @Configuration @ConditionalOnClass({ Servlet.class, Server.class, Loader.class }) - @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, parentContext = false) + @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT) public static class EmbeddedJetty { @Bean diff --git a/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/condition/AbstractOnBeanCondition.java b/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/condition/AbstractOnBeanCondition.java index 791f23dbcc0..afa4cb97e69 100644 --- a/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/condition/AbstractOnBeanCondition.java +++ b/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/condition/AbstractOnBeanCondition.java @@ -98,13 +98,12 @@ abstract class AbstractOnBeanCondition implements ConfigurationCondition { String checking = ConditionLogUtils.getPrefix(this.logger, metadata); - Boolean considerHierarchy = (Boolean) metadata.getAnnotationAttributes( - annotationClass().getName()).get("parentContext"); - considerHierarchy = (considerHierarchy == null ? false : considerHierarchy); + SearchStrategy search = (SearchStrategy) metadata.getAnnotationAttributes( + annotationClass().getName()).get("search"); + search = search == null ? SearchStrategy.ALL : search; - Boolean parentOnly = (Boolean) metadata.getAnnotationAttributes( - annotationClass().getName()).get("parentOnly"); - parentOnly = (parentOnly == null ? false : parentOnly); + boolean considerHierarchy = search == SearchStrategy.ALL; + boolean parentOnly = search == SearchStrategy.PARENTS; List beanClassesFound = new ArrayList(); List beanNamesFound = new ArrayList(); diff --git a/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/condition/ConditionalOnBean.java b/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/condition/ConditionalOnBean.java index 1908b264f03..869ca873dca 100644 --- a/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/condition/ConditionalOnBean.java +++ b/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/condition/ConditionalOnBean.java @@ -53,13 +53,9 @@ public @interface ConditionalOnBean { String[] name() default {}; /** - * If the application context hierarchy (parent contexts) should be considered. + * Strategy to decide if the application context hierarchy (parent contexts) should be + * considered. */ - boolean parentContext() default true; - - /** - * If only the application parent contexts should be considered. - */ - boolean parentOnly() default false; + SearchStrategy search() default SearchStrategy.ALL; } diff --git a/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/condition/ConditionalOnMissingBean.java b/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/condition/ConditionalOnMissingBean.java index dc3a69a8947..8f1c8193087 100644 --- a/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/condition/ConditionalOnMissingBean.java +++ b/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/condition/ConditionalOnMissingBean.java @@ -53,8 +53,9 @@ public @interface ConditionalOnMissingBean { String[] name() default {}; /** - * If the application context hierarchy (parent contexts) should be considered. + * Strategy to decide if the application context hierarchy (parent contexts) should be + * considered. */ - boolean parentContext() default true; + SearchStrategy search() default SearchStrategy.ALL; } diff --git a/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/condition/SearchStrategy.java b/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/condition/SearchStrategy.java new file mode 100644 index 00000000000..2e9aa284958 --- /dev/null +++ b/spring-bootstrap/src/main/java/org/springframework/bootstrap/context/condition/SearchStrategy.java @@ -0,0 +1,40 @@ +/* + * Copyright 2012-2013 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 + * + * http://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.bootstrap.context.condition; + +/** + * Some named search strategies for beans in the bean factory hierarchy. + * + * @author Dave Syer + */ +public enum SearchStrategy { + + /** + * Search only the current context + */ + CURRENT, + /** + * Search all parents and ancestors, but not the current context + */ + PARENTS, + /** + * Search the entire hierarchy + * + */ + ALL; + +} diff --git a/spring-bootstrap/src/test/java/org/springframework/bootstrap/context/condition/OnMissingBeanConditionTests.java b/spring-bootstrap/src/test/java/org/springframework/bootstrap/context/condition/OnMissingBeanConditionTests.java index 11d22c4aa84..a2937ec41dd 100644 --- a/spring-bootstrap/src/test/java/org/springframework/bootstrap/context/condition/OnMissingBeanConditionTests.java +++ b/spring-bootstrap/src/test/java/org/springframework/bootstrap/context/condition/OnMissingBeanConditionTests.java @@ -111,7 +111,7 @@ public class OnMissingBeanConditionTests { } @Configuration - @ConditionalOnMissingBean(name = "foo", parentContext = false) + @ConditionalOnMissingBean(name = "foo", search = SearchStrategy.CURRENT) protected static class HierarchyNotConsidered { @Bean public String bar() {