Spring框架-Bean作用域中單例模式和多例模式的區別

2020-10-18 12:00:26

Spring框架-Bean作用域中單例模式和多例模式的區別

一、單例模式的特點(當沒有指定是單例模式還是多例模式的時候,預設是單例模式):
1、Spring容器建立的時候,對應的類的範例化物件一起被建立。
2、不管獲取多少次某個類建立的物件,該範例化物件都只會被建立一次。
二、多例模式的特點:
1、Spring容器建立的時候,對應的類的範例化物件不會被建立,只有在被獲取的時候才會被建立。
2、每次獲取的時候都會建立一個新的範例化物件。
三、下面通過一個案例來演示這兩種模式的區別
1、新建一個普通類,包含無參構造方法和有參構造方法,還有一個展示物件資訊的方法。

package com.qst.service;

public class EmpServiceImp {
	private int id=1;
	private String name="張倩";
	private String address="浙江杭州";
		
	public EmpServiceImp() {
		System.out.println("EmpServiceImp範例化。。。");
	}

	public EmpServiceImp(int id, String name, String address) {
		this.id = id;
		this.name = name;
		this.address = address;
	}


	public void showEmp() {
		System.out.println(id+"--"+name+"--"+address);
	}
}

2、在applicationContext.xml檔案中寫一個沒有指定單例還是多例模式的bean,可以給該bean取一個別名

<bean id="service" class="com.qst.service.EmpServiceImp"/>
<!-- 取別名 -->
     <alias name="service" alias="ser"/>

3、寫一個測試方法

package com.qst.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.qst.service.EmpServiceImp;

public class AppContextTest {

	public static void main(String[] args) {
		//建立Spring容器
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");//組態檔的路徑
	}
}

在這裡插入圖片描述輸出了語句「EmpServiceImp範例化。。。」說明當沒有指定是單例模式還是多例模式的時候,預設是單例模式
4、指定單例模式:scope=「singleton」

<bean id="service" class="com.qst.service.EmpServiceImp" scope="singleton"/>
     <!-- 取別名 -->
     <alias name="service" alias="ser"/>
package com.qst.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.qst.service.EmpServiceImp;

public class AppContextTest {

	public static void main(String[] args) {
		//建立Spring容器
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");//組態檔的路徑		 
	}
}

結果說明Spring容器建立的時候,對應的類的範例化物件一起被建立。

package com.qst.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.qst.service.EmpServiceImp;

public class AppContextTest {

	public static void main(String[] args) {
		//建立Spring容器
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");//組態檔的路徑
	    //獲取類建立的物件				
		 EmpServiceImp service=(EmpServiceImp)ac.getBean("ser"); 
		 service .showEmp();
		 EmpServiceImp service2=(EmpServiceImp)ac.getBean("ser"); 
		 service2 .showEmp();	 
	}
}

在這裡插入圖片描述結果範例化了一次,show方法了兩次。說明不管獲取多少次某個類建立的物件,該範例化物件都只會被建立一次。
5、指定多例模式:scope=「prototype」

<bean id="service" class="com.qst.service.EmpServiceImp" scope="prototype"/>
     <!-- 取別名 -->
     <alias name="service" alias="ser"/>
package com.qst.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.qst.service.EmpServiceImp;

public class AppContextTest {

	public static void main(String[] args) {
		//建立Spring容器
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");//組態檔的路徑
	    //獲取類建立的物件	
		 EmpServiceImp service=(EmpServiceImp)ac.getBean("ser"); 
		 service .showEmp();
		 EmpServiceImp service2=(EmpServiceImp)ac.getBean("ser"); 
		 service2 .showEmp();		 
	}
}

在這裡插入圖片描述結果範例化了兩次,show方法了兩次。說明每次獲取的時候都會建立一個新的範例化物件。