From c0b7d175e9e35ce5cb8343a40361b3eb2f5d9284 Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Mon, 23 May 2011 10:04:00 +0000 Subject: [PATCH] Delegate parent environment to child app contexts Calls to AbstractApplicationContext#setParent delegate the parent context environment to the child. This ensures that any property sources added to the parent are available to the child as well as ensuring that any profiles activated are activated everywhere. Child contexts may still choose to replace their environment (through an ApplicationContextInitializer, for example). In any case, however, in the root/child web application context relationship established by ContextLoader + DispatcherServlet, the child is guaranteed to have already been given the parent environment by the time it is delegated to any ACIs. See AbstractApplicationContext#setParent for implementation See FrameworkServlet#createWebApplicationContext for order in which setParent then initializeWebApplicationContext are called. Issue: SPR-8185 git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@4353 50f2f4bb-b051-0410-bef5-90022cba6387 --- .../context/support/AbstractApplicationContext.java | 9 +++++++++ .../AbstractRefreshablePortletApplicationContext.java | 9 +++++++++ .../portlet/context/StaticPortletApplicationContext.java | 9 +++++++++ .../web/context/XmlWebApplicationContextTests.java | 7 +++++++ 4 files changed, 34 insertions(+) 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 ecc13c9a52f..84831884b7b 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 @@ -376,8 +376,17 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader // Implementation of ConfigurableApplicationContext interface //--------------------------------------------------------------------- + /** + * {@inheritDoc} + *

The parent {@linkplain #getEnvironment() environment} is + * delegated to this (child) context if the parent is a + * {@link ConfigurableApplicationContext} implementation. + */ public void setParent(ApplicationContext parent) { this.parent = parent; + if (parent instanceof ConfigurableApplicationContext) { + this.setEnvironment(((ConfigurableApplicationContext)parent).getEnvironment()); + } } public void addBeanFactoryPostProcessor(BeanFactoryPostProcessor beanFactoryPostProcessor) { diff --git a/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/context/AbstractRefreshablePortletApplicationContext.java b/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/context/AbstractRefreshablePortletApplicationContext.java index 4269eed798d..459a03c7644 100644 --- a/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/context/AbstractRefreshablePortletApplicationContext.java +++ b/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/context/AbstractRefreshablePortletApplicationContext.java @@ -87,6 +87,15 @@ public abstract class AbstractRefreshablePortletApplicationContext extends Abstr setDisplayName("Root PortletApplicationContext"); } + /** + * {@inheritDoc} + *

The parent {@linkplain #getEnvironment() environment} is + * delegated to this (child) context if the parent is a + * {@link ConfigurableApplicationContext} implementation. + *

The parent {@linkplain #getServletContext() servlet context} is + * delegated to this (child) context if the parent is a {@link WebApplicationContext} + * implementation. + */ @Override public void setParent(ApplicationContext parent) { super.setParent(parent); diff --git a/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/context/StaticPortletApplicationContext.java b/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/context/StaticPortletApplicationContext.java index 56011eb7cd5..7ffc7633657 100644 --- a/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/context/StaticPortletApplicationContext.java +++ b/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/context/StaticPortletApplicationContext.java @@ -84,6 +84,15 @@ public class StaticPortletApplicationContext extends StaticApplicationContext this.portletContext, this.portletConfig); } + /** + * {@inheritDoc} + *

The parent {@linkplain #getEnvironment() environment} is + * delegated to this (child) context if the parent is a + * {@link ConfigurableApplicationContext} implementation. + *

The parent {@linkplain #getServletContext() servlet context} is + * delegated to this (child) context if the parent is a {@link WebApplicationContext} + * implementation. + */ @Override public void setParent(ApplicationContext parent) { super.setParent(parent); diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/context/XmlWebApplicationContextTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/context/XmlWebApplicationContextTests.java index 91117a79567..b20b13220bd 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/context/XmlWebApplicationContextTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/context/XmlWebApplicationContextTests.java @@ -16,6 +16,9 @@ package org.springframework.web.context; +import static org.hamcrest.CoreMatchers.sameInstance; +import static org.junit.Assert.assertThat; + import java.util.Locale; import javax.servlet.ServletException; @@ -72,6 +75,10 @@ public class XmlWebApplicationContextTests extends AbstractApplicationContextTes return wac; } + public void testEnvironmentInheritance() { + assertThat(this.applicationContext.getEnvironment(), sameInstance(this.root.getEnvironment())); + } + /** * Overridden as we can't trust superclass method * @see org.springframework.context.AbstractApplicationContextTests#testEvents()