先做一個實驗
xml配置檔案配置一個bean
<bean id="car" class="com.beans.relation.Car">
<property name="brand" value="Audi"></property>
<property name="price" value="2222222"></property>
</bean>
然後在運作主類裡面建立兩個car對象
Car car=(Car) ctx.getBean("car");
Car car2=(Car) ctx.getBean("car");
System.out.println(car==car2);
運作
運作結果為true,說明這兩個是一樣的。因為預設的是單例的。
如果改變這個bean的作用域,就是false而不是true了
<!-- 使用bean的scope屬性來配置bean的作用域
singleton:預設值,容器初始化時建立bean執行個體,在整個容器的生命周期内隻建立一個bean,單例的
-->
<bean id="car" class="com.beans.relation.Car" scope="prototype">
<property name="brand" value="Audi"></property>
<property name="price" value="2222222"></property>
</bean>
這個bean不是單例的,就是每次向容器擷取一個bean的時候都會産生一個新的bean。
我們來加深一下了解;
把bean的作用域改為singleton,然後在Car類裡面寫一個無參的構造方法。
public Car() {
super();
// TODO Auto-generated constructor stub
System.out.println("Car's constructor....");
}
在運作主類裡面,把幾行代碼注釋掉
ApplicationContext ctx=new ClassPathXmlApplicationContext("scope.xml");
/*Car car=(Car) ctx.getBean("car");
Car car2=(Car) ctx.getBean("car");
System.out.println(car==car2);
*/
運作發現,在建立容器的時候,bean就已經被建立好了。
但是在改變bean的作用域之後,改為prototype後,發現不行了,并沒有語句輸出。
将運作主類裡面的注釋拿掉。再次運作。
Car car=(Car) ctx.getBean("car");
Car car2=(Car) ctx.getBean("car");
System.out.println(car==car2);