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
This commit is contained in:
Chris Beams
2011-05-23 10:04:00 +00:00
parent c696e195fa
commit c4363673dc
4 changed files with 34 additions and 0 deletions

View File

@@ -376,8 +376,17 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader
// Implementation of ConfigurableApplicationContext interface
//---------------------------------------------------------------------
/**
* {@inheritDoc}
* <p>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) {