繁体   English   中英

通过初始化方法进行春豆属性填充

[英]Spring bean property population through init method

我有一个关于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初始化中已填充的非常相同的列表对象。 有人可以解释吗?

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

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

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不会继承超类的属性。

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

当Spring创建bean id = "sub" ,它没有调用init-method因为没有指定任何方法。 如果将init-method添加到sub bean的定义中,则应该看到预期的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM