singleton:此模式會在ApplicationContext建立後建立組態檔中所有的singleton元件,也就是說在「ApplicationContext context = new ClassPathXmlApplicationContext("beans.config.xml");」
這一行時物件該new的都new了,呼叫getBean只是回傳已經new好的Bean物件而已
使用singleton又不希望建立後就new,則要在設定檔中加上<bean lazy-init="true">
prototype:getBean的時候才new出物件(事前不存在),每getBean一次就new一個新的
public class TestScope {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.config.xml");
DemoBean demoBean0 = (DemoBean) context.getBean("demoBean0");
System.out.println("demoBean0="+demoBean0);
DemoBean demoBean1 = (DemoBean) context.getBean("demoBean0");
System.out.println("demoBean1="+demoBean1);
}
}
如果在設定檔xml中沒有設定Scope的話,預設是singleton,只要呼叫相同id就會是同一個物件
<bean id="demoBean0" class="model.DemoBean" >
<constructor-arg value="這是一個demo的value1,用建構子一個參數"></constructor-arg>
</bean>
demoBean0=model.DemoBean@158fe70
demoBean1=model.DemoBean@158fe70
如果在設定檔xml中有設定Scope="prototype"的話,呼叫相同id就會是(呼叫、new)不同一個物件
<bean id="demoBean0" class="model.DemoBean" scope="prototype">
<constructor-arg value="這是一個demo的value1,用建構子一個參數"></constructor-arg>
</bean>
demoBean0=model.DemoBean@158fe70
demoBean1=model.DemoBean@11aa95a
以上結果用hashcode方法也是一樣
來源:http://openhome.cc/Gossip/JavaEssence/ObjectEquality.html
在Object的hashCode() 說明 指出:
- 在同一個應用程式執行期間,對同一物件呼叫 hashCode()方法,必須回傳相同的整數結果。
- 如果兩個物件使用equals(Object)測試結果為相等, 則這兩個物件呼叫hashCode()時,必須獲得相同的整數結果。
- 如果兩個物件使用equals(Object)測試結果為不相等, 則這兩個物件呼叫hashCode()時,可以獲得不同的整數結果。