Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring: Nested application contexts

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?

like image 219
Itay Maman Avatar asked Dec 29 '22 20:12

Itay Maman


1 Answers

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

like image 175
skaffman Avatar answered Jan 08 '23 23:01

skaffman