Spring: Nested application contexts

dependency-injection, java, spring

Solution

You can't do that. Parent contexts cannot refer to bean definitions in the child contexts. It only works the other way around.

Problem

I have a hierarchy of application contexts. The bean that is defined in the parent context depends on a bean that is defined in the child. Here's how it looks like: ``` public class X { public static class A { public B b; public void setB(B b) { this.b = b; } } public static class B { } public static void main(String[] args) { ClassPathXmlApplicationContext parent = new ClassPathXmlApplicationContext( "/a.xml"); go1(parent); } public static void go1(ClassPathXmlApplicationContext parent) { GenericApplicationContext child = new GenericApplicationContext(parent); child.getBeanFactory().registerSingleton("b", new B()); A a = (A) child.getBean("a"); Assert.assertNotNull(a.b); } } ``` The xml file defining the "a" bean looks like this: ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="a" class="X$A" autowire="byName" lazy-init="true"/> </beans> ``` The problem is that B is not injected into A. Injection will occur only if I register the "b" singleton with the parent - which is not an option in my program. Any ideas?

Original source