0

我有一个关于 spring bean 初始化的问题。当我们通过 init 方法填充 bean 属性时会出现什么情况。看看下面给出的代码片段。在这里,我通过 init 方法填充超类 bean 属性列表。

1)超级类豆:

public class Super  {
    private List<String> list = new ArrayList<String>();
    public void setList(List<String> list) {
        this.list = list;
    }
    public void init(){
     System.out.println("Super init called");
     populateList();
     System.out.println("Super list"+list.size());
    }
    public void populateList(){
        list.add("A");
        list.add("B");
    }
    public List<String> getList() {
        return list;
    }
}

2)豆2:

public class Sub extends Super {
    public static void main(String[] args) {
        ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/appXml/init-test.xml");
        Sub utils = (Sub)ctx.getBean("sub");

        System.out.println("Sub list:::"+utils.getList().size());
        for(String s : utils.getList()){
            System.out.println("Value::::" +s);
        }
    }
}

3)弹簧上下文xml:

<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-3.0.xsd">
    <bean id = "super" class = "com.hitesh.springtest.Super" init-method="init">
    </bean>
    <bean id = "sub" class = "com.hitesh.springtest.Sub"></bean>    
    </beans>

4) 输出:Super init 称为 Super list2 Sub list:::0

我的问题是,当容器初始化超类时,会调用 init()。在此方法中,列表对象被填充。现在,当子类实例化完成时,为什么我们将列表大小设为 0,因为我们指的是在超级 bean 初始化中填充的完全相同的列表对象。有人可以解释一下吗?

4

3 回答 3

3

它不是very same list object. 您的上下文中有两个对象:supersub. 由于list是实例字段,因此list存在对象的两个实例,一个为super,一个为sub。一个 forsub从未初始化,因为init-method没有为那个 bean 设置。

于 2013-06-10T11:48:25.483 回答
1

可以说,您正在初始化对象而不是弹簧(松散地在弹簧容器的行上),代码看起来像这样

Super super = new Super();
super.init();

Sub sub = new Sub();

//now if you say 
sub.getList().size();
//This will always print size zero as you never initialized the super class collection.

所以有两个不同的对象。如果将其定义为另一个bean ,则 Spring 不会继承超类的属性。

于 2013-06-10T13:40:58.520 回答
0

您会看到“Super list2”,因为 Spring 正在创建一个beanwith并且它 在创建它时id = "super"调用.init-methodSpring-context.xml

当 Spring 创建bean id = "sub"时,它不会调用 ,init-method因为没有指定。如果您将 添加init-method到 bean 的定义中sub,您应该会看到您所期望的行为。

于 2013-06-10T11:47:29.300 回答