我剛剛開始閱讀「Spring In Action - 第三版」,並且在嘗試佈線概念的過程中堅持了下來。我無法理解一個bean的生命週期編寫這些代碼之後:春季新手:豆類加載和接線流程
public class TestCase {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("test.xml");
Test1 t1 = (Test1)context.getBean("test1");
t1.setName1("Win");
Test1 t2 = (Test1)context.getBean("test1");
t2.setName1("Lin");
Test2 t3 = (Test2)context.getBean("test2");
Test1 t4 = t3.getName();
System.out.println("End" +t4.getName1());
}
}
public class Test1 {
private String name1;
public String getName1() {
System.out.println("test1 - getter");
return name1;
}
public void setName1(String name1) {
System.out.println("test1 - setter");
this.name1 = name1;
}
public void onStart()
{
System.out.println("start1");
}
public void onStop()
{
System.out.println("stop1");
}
}
public class Test2 {
private int age;
private Test1 name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Test1 getName() {
System.out.println("test2 - getter");
return name;
}
public void setName(Test1 name) {
System.out.println("test2 - setter");
this.name = name;
}
public void onStart()
{
System.out.println("start2");
}
public void onStop()
{
System.out.println("stop2");
}
}
這裏是我的test.xml:
<bean id="test1" class="springidol.Test1" init-method="onStart" destroy-method="onStop" >
</bean>
<bean id="test2" class="springidol.Test2" init-method="onStart" destroy-method="onStop">
<property name="name" ref="test1"></property>
</bean>
輸出是:
start1
test2 - setter
start2
test1 - setter
test1 - setter
test2 - getter
test1 - getter
End - Lin
如果我改變測試範圍1原型我得到:
start1
test2 - setter
start2
start1
test1 - setter
start1
test1 - setter
test2 - getter
test1 - getter
End - null
我知道我的要求太高了,但是有人能讓我知道這裏涉及的步驟 - 我無法理解爲什麼在完成tst1的加載(甚至在加載test2之前)之後調用test2 setter!
其次,爲什麼原型和默認範圍的「結束」輸出不同? 謝謝。
謝謝Omnaest。是否像構造函數和init-methods在連線(setter方法)之後被調用?對我來說似乎很陌生...爲什麼不被稱爲摧毀方法? – SlowAndSteady 2012-01-14 11:10:21
可能你殺了JVM,並且不關閉應用程序上下文。後一種行動要求銷燬方法。 – Omnaest 2012-01-14 19:36:00