天天看點

初學Spring——Bean的作用域(singleton單例+prototype原型)

文章目錄

      • 什麼是Bean?
      • Bean的兩種常用作用域
        • 什麼是作用域?
        • 小試一下
        • singleton作用域
        • prototype作用域
      • 總結

什麼是Bean?

Bean是指 項目中提供業務功能的Bean ,也就是容器要管理的Bean。Bean就是一個常見的JavaBean、Java類。

Bean的兩種常用作用域

什麼是作用域?

土裡來,土裡去。個人認為作用域就是bean的應用範圍。有的bean能夠長長久久的使用,而有的bean使用一次就丢掉了。這類似于servlet裡面的request和session。request能夠在一次或者多次轉發中使用,到最後也就一個頁面用一次,出去這個頁面你就擷取不到這個request了;而session是在你不關閉網頁的前提下持續使用。

小試一下

在不改變任何bean的配置下,先執行一遍預設的建立步驟。

  1. 建立類Scope.java
package com.dz.scope;

public class Scope {
//裡面沒有任何内容
}

           
  1. 将Scope類裝配到容器中
<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">
	<!--scope裝配到容器中-->
	<bean id="scope" class="com.dz.scope.Scope"></bean>

</beans>
           
  1. 建立測試類TestScope.java
public class TestScope {

	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		//調用Spring容器裡面的對象
		System.out.println("第一次調用:"+ac.getBean("scope",Scope.class));
		System.out.println("第二次調用:"+ac.getBean("scope",Scope.class));		
	}
}
           
  1. 控制台輸出結果
初學Spring——Bean的作用域(singleton單例+prototype原型)

顯而易見的,在Spring容器中裝配的Scope類,調用擷取兩次的情況下輸出位址相同,是以使用的是一個對象。

singleton作用域

在上面的基礎上,對配置檔案的bean做一下改變

<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">
	<!--scope裝配到容器中,并加一個scope屬性=“singleton”-->
	<bean id="scope" class="com.dz.scope.Scope" scope="singleton"></bean>

</beans>
           

再次看控制台輸出結果

初學Spring——Bean的作用域(singleton單例+prototype原型)

位址還是相同的,是以Spring在預設的情況下建立Bean對象是單例的(singleton)。

prototype作用域

繼續在上面的基礎上,對配置檔案的Bean進行改變

<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">
	<!--scope裝配到容器中,并加一個scope屬性="prototype"-->
	<bean id="scope" class="com.dz.scope.Scope" scope="prototype"></bean>

</beans>
           

看控制台輸出結果

初學Spring——Bean的作用域(singleton單例+prototype原型)

很明顯的位址不同了,說明在第二次的調用過程中,容器又又又建立了一個對象,這個建立過程叫做原型(prototype)。

總結

容器在調用對象的時候每次都是一樣的叫做singleton單例。

容器在調用對象的時候每次都不一樣的叫做prototype原型。