diff --git a/org.springframework.context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java b/org.springframework.context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java index 833e43b441..297f0a0ca3 100644 --- a/org.springframework.context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java +++ b/org.springframework.context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java @@ -32,6 +32,7 @@ import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.DisposableBean; @@ -73,6 +74,7 @@ import org.springframework.core.Ordered; import org.springframework.core.PriorityOrdered; import org.springframework.core.convert.ConversionService; import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.Environment; import org.springframework.core.env.StandardEnvironment; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; @@ -224,7 +226,7 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader public AbstractApplicationContext(ApplicationContext parent) { this.parent = parent; this.resourcePatternResolver = getResourcePatternResolver(); - this.environment = this.createEnvironment(); + this.environment = createEnvironment(); } @@ -387,9 +389,9 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader public void setParent(ApplicationContext parent) { this.parent = parent; if (parent != null) { - Object parentEnvironment = parent.getEnvironment(); + Environment parentEnvironment = parent.getEnvironment(); if (parentEnvironment instanceof ConfigurableEnvironment) { - this.environment.merge((ConfigurableEnvironment)parentEnvironment); + getEnvironment().merge((ConfigurableEnvironment) parentEnvironment); } } } @@ -505,7 +507,7 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader // Validate that all properties marked as required are resolvable // see ConfigurablePropertyResolver#setRequiredProperties - this.environment.validateRequiredProperties(); + getEnvironment().validateRequiredProperties(); } /** @@ -541,7 +543,7 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader // Tell the internal bean factory to use the context's class loader etc. beanFactory.setBeanClassLoader(getClassLoader()); beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver()); - beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, this.getEnvironment())); + beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment())); // Configure the bean factory with context callbacks. beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); @@ -566,15 +568,13 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader } // Register default environment beans. - if (!beanFactory.containsBean(ENVIRONMENT_BEAN_NAME)) { + if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment()); } - - if (!beanFactory.containsBean(SYSTEM_PROPERTIES_BEAN_NAME)) { + if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties()); } - - if (!beanFactory.containsBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) { + if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment()); } } diff --git a/org.springframework.context/src/test/java/org/springframework/context/support/EnvironmentIntegrationTests.java b/org.springframework.context/src/test/java/org/springframework/context/support/EnvironmentIntegrationTests.java new file mode 100644 index 0000000000..c676df57c9 --- /dev/null +++ b/org.springframework.context/src/test/java/org/springframework/context/support/EnvironmentIntegrationTests.java @@ -0,0 +1,52 @@ +/* + * Copyright 2002-2012 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.context.support; + +import org.junit.Test; + +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.core.env.ConfigurableEnvironment; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +/** + * Tests covering the integration of {@link Environment} into {@link ApplicationContext} hierarchies. + * + * @author Chris Beams + */ +public class EnvironmentIntegrationTests { + + @SuppressWarnings("unchecked") + @Test + public void repro() { + ConfigurableApplicationContext parent = new GenericApplicationContext(); + parent.refresh(); + + AnnotationConfigApplicationContext child = new AnnotationConfigApplicationContext(); + child.setParent(parent); + child.refresh(); + + ConfigurableEnvironment env = child.getBean(ConfigurableEnvironment.class); + assertThat("unknown env", env, anyOf( + sameInstance(parent.getEnvironment()), + sameInstance(child.getEnvironment()))); + assertThat("expected child ctx env", env, sameInstance(child.getEnvironment())); + } + +}