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 になるのはなぜですか。誰かがこれを説明できますか?