0

Spring Bean の初期化に関して 1 つ質問があります。init メソッドを使用して Bean プロパティを設定する場合、どのようなシナリオになるでしょうか。以下のコード スニペットをご覧ください。ここでは、init メソッドを使用してスーパー クラス Bean のプロパティ リストを設定しています。

1) スーパークラス Bean :

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 list2 Sub list:::0 という名前の Super init

私の質問は、スーパークラスがコンテナによって初期化されるときに init() が呼び出されることです。このメソッドでは、リスト オブジェクトが設定されます。サブクラスのインスタンス化が完了すると、スーパー Bean の初期化で入力されたのとまったく同じリスト オブジェクトを参照しているため、リスト サイズが 0 になるのはなぜですか。誰かがこれを説明できますか?

4

3 に答える 3

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.

したがって、2 つの異なるオブジェクトがあります。別のBeanとして定義されている場合、Spring はスーパークラスのプロパティを継承しません。

于 2013-06-10T13:40:58.520 に答える