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 96d9948346..d6cccea1e4 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 @@ -81,6 +81,7 @@ public class EndpointWebMvcChildContextConfiguration implements @Configuration @ConditionalOnClass({ EnableWebSecurity.class, Filter.class }) + @ConditionalOnBean(name = "springSecurityFilterChain", parentOnly = true) public static class EndpointWebMvcChildContextSecurityConfiguration { // FIXME reuse of security filter here is not good. What if totally different @@ -88,7 +89,6 @@ public class EndpointWebMvcChildContextConfiguration implements // port? @Bean - @ConditionalOnBean(name = "springSecurityFilterChain") public Filter springSecurityFilterChain(HierarchicalBeanFactory beanFactory) { BeanFactory parent = beanFactory.getParentBeanFactory(); return parent.getBean("springSecurityFilterChain", Filter.class); diff --git a/spring-actuator/src/test/java/org/springframework/actuate/autoconfigure/EndpointWebMvcAutoConfigurationTests.java b/spring-actuator/src/test/java/org/springframework/actuate/autoconfigure/EndpointWebMvcAutoConfigurationTests.java index 6fe7c6c2f0..605ae54e46 100644 --- a/spring-actuator/src/test/java/org/springframework/actuate/autoconfigure/EndpointWebMvcAutoConfigurationTests.java +++ b/spring-actuator/src/test/java/org/springframework/actuate/autoconfigure/EndpointWebMvcAutoConfigurationTests.java @@ -22,7 +22,6 @@ import java.net.URI; import java.nio.charset.Charset; import org.junit.After; -import org.junit.Ignore; import org.junit.Test; import org.springframework.actuate.endpoint.AbstractEndpoint; import org.springframework.actuate.endpoint.Endpoint; @@ -84,8 +83,6 @@ public class EndpointWebMvcAutoConfigurationTests { } @Test - @Ignore - // FIXME: this broke recently public void onDifferentPort() throws Exception { this.applicationContext.register(RootConfig.class, DifferentPortConfig.class, PropertyPlaceholderAutoConfiguration.class, @@ -120,8 +117,6 @@ public class EndpointWebMvcAutoConfigurationTests { } @Test - @Ignore - // FIXME: this broke recently public void specificPortsViaProperties() throws Exception { TestUtils.addEnviroment(this.applicationContext, "server.port:7070", "management.port:7071"); 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 119adecd57..e27a3371c0 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 @@ -50,7 +50,7 @@ public class EmbeddedServletContainerAutoConfiguration { * {@link EmbeddedServletContainerCustomizer}s. */ @Bean - @ConditionalOnMissingBean(value = EmbeddedServletContainerCustomizerBeanPostProcessor.class, considerHierarchy = false) + @ConditionalOnMissingBean(value = EmbeddedServletContainerCustomizerBeanPostProcessor.class, parentContext = false) public EmbeddedServletContainerCustomizerBeanPostProcessor embeddedServletContainerCustomizerBeanPostProcessor() { return new EmbeddedServletContainerCustomizerBeanPostProcessor(); } @@ -64,7 +64,7 @@ public class EmbeddedServletContainerAutoConfiguration { @Bean @ConditionalOnMissingBean(value = { ServletContextInitializer.class, - Servlet.class }, considerHierarchy = false) + Servlet.class }, parentContext = false) public DispatcherServlet dispatcherServlet() { return new DispatcherServlet(); } @@ -75,7 +75,7 @@ public class EmbeddedServletContainerAutoConfiguration { */ @Configuration @ConditionalOnClass({ Servlet.class, Tomcat.class }) - @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, considerHierarchy = false) + @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, parentContext = false) public static class EmbeddedTomcat { @Bean @@ -90,7 +90,7 @@ public class EmbeddedServletContainerAutoConfiguration { */ @Configuration @ConditionalOnClass({ Servlet.class, Server.class, Loader.class }) - @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, considerHierarchy = false) + @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, parentContext = false) 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 aeac65a736..791f23dbcc 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 @@ -22,6 +22,7 @@ import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.context.annotation.Bean; @@ -98,18 +99,30 @@ abstract class AbstractOnBeanCondition implements ConfigurationCondition { String checking = ConditionLogUtils.getPrefix(this.logger, metadata); Boolean considerHierarchy = (Boolean) metadata.getAnnotationAttributes( - annotationClass().getName()).get("considerHierarchy"); + annotationClass().getName()).get("parentContext"); considerHierarchy = (considerHierarchy == null ? false : considerHierarchy); + Boolean parentOnly = (Boolean) metadata.getAnnotationAttributes( + annotationClass().getName()).get("parentOnly"); + parentOnly = (parentOnly == null ? false : parentOnly); + List beanClassesFound = new ArrayList(); List beanNamesFound = new ArrayList(); + // eagerInit set to false to prevent early instantiation (some + // factory beans will not be able to determine their object type at this + // stage, so those are not eligible for matching this condition) + ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); + if (parentOnly) { + BeanFactory parent = beanFactory.getParentBeanFactory(); + if (!(parent instanceof ConfigurableListableBeanFactory)) { + throw new IllegalStateException( + "Cannot use parentOnly if parent is not ConfigurableListableBeanFactory"); + } + beanFactory = (ConfigurableListableBeanFactory) parent; + } for (String beanClass : beanClasses) { try { - // eagerInit set to false to prevent early instantiation (some - // factory beans will not be able to determine their object type at this - // stage, so those are not eligible for matching this condition) - ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); Class type = ClassUtils.forName(beanClass, context.getClassLoader()); String[] beans = (considerHierarchy ? BeanFactoryUtils .beanNamesForTypeIncludingAncestors(beanFactory, type, false, @@ -124,8 +137,8 @@ abstract class AbstractOnBeanCondition implements ConfigurationCondition { } } for (String beanName : beanNames) { - if (considerHierarchy ? context.getBeanFactory().containsBean(beanName) - : context.getBeanFactory().containsLocalBean(beanName)) { + if (considerHierarchy ? beanFactory.containsBean(beanName) : beanFactory + .containsLocalBean(beanName)) { beanNamesFound.add(beanName); } } 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 c9a795c12f..1908b264f0 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 @@ -55,6 +55,11 @@ public @interface ConditionalOnBean { /** * If the application context hierarchy (parent contexts) should be considered. */ - boolean considerHierarchy() default true; + boolean parentContext() default true; + + /** + * If only the application parent contexts should be considered. + */ + boolean parentOnly() default false; } 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 c15194f57b..dc3a69a894 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 @@ -55,6 +55,6 @@ public @interface ConditionalOnMissingBean { /** * If the application context hierarchy (parent contexts) should be considered. */ - boolean considerHierarchy() default true; + boolean parentContext() default true; } 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 4a7b8a2fb0..11d22c4aa8 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 @@ -17,8 +17,6 @@ package org.springframework.bootstrap.context.condition; import org.junit.Test; -import org.springframework.bootstrap.context.condition.ConditionalOnMissingBean; -import org.springframework.bootstrap.context.condition.OnMissingBeanCondition; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -113,7 +111,7 @@ public class OnMissingBeanConditionTests { } @Configuration - @ConditionalOnMissingBean(name = "foo", considerHierarchy = false) + @ConditionalOnMissingBean(name = "foo", parentContext = false) protected static class HierarchyNotConsidered { @Bean public String bar() {