天天看點

spring bean的作用域:singleton和prototype的差別

先做一個實驗

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);      

運作

spring bean的作用域:singleton和prototype的差別

運作結果為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就已經被建立好了。

spring bean的作用域:singleton和prototype的差別

但是在改變bean的作用域之後,改為prototype後,發現不行了,并沒有語句輸出。

将運作主類裡面的注釋拿掉。再次運作。

Car car=(Car) ctx.getBean("car");
        Car car2=(Car) ctx.getBean("car");
        
        System.out.println(car==car2);