Spring中@Scope的幾種取值方式
@Scope的幾種取值
1、singleton
:一個Spring容器中只有一個Bean的實(shí)例,此為Spring的默認(rèn)配置,全容器共享一個實(shí)例
2、prototype
:每次調(diào)用新建一個Bean的實(shí)例
3、Request
:Web項(xiàng)目中,給每一個http request新建一個Bean實(shí)例
4、Session
:Web項(xiàng)目中,給每一個http session新建一個Bean實(shí)例。
5、GlobalSession
:這個只在portal應(yīng)用中有用,給每一個global http session新建一個Bean實(shí)例。
Spring入門詳解scope屬性
一、scope屬性
spring中scope是一個非常關(guān)鍵的概念,簡單說就是對象在spring容器(IOC容器)中的生命周期,也可以理解為對象在spring容器中的創(chuàng)建方式。
二、scope分類
目前,scope的取值有5種取值:
在Spring 2.0之前,有singleton和prototype兩種;
在Spring 2.0之后,為支持web應(yīng)用的ApplicationContext,增強(qiáng)另外三種:request,session和global session類型,它們只實(shí)用于web程序,通常是和XmlWebApplicationContext共同使用。
三、scope取值
1.singleton
此取值時表明容器中創(chuàng)建時只存在一個實(shí)例,所有引用此bean都是單一實(shí)例。用代碼實(shí)例
代碼如下(示例):
Student類
package entity; public class Student { private int studentNo; private String studentName; public Student() { System.out.println("無參構(gòu)造函數(shù)被使用"); } public int getStudentNo() { return studentNo; } public void setStudentNo(int studentNo) { this.studentNo = studentNo; } public String getStudentName() { return studentName; } public void setStudentName(String studentName) { this.studentName = studentName; } // @Override // public String toString() { // return "Student{" + // "studentNo=" + studentNo + // ", studentName='" + studentName + '\'' + // '}'; // } }
測試代碼
package test; import entity.Student; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringTest { @Test // 測試scope屬性,scope="singleton" public void test1(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Student student1= (Student) context.getBean("student"); Student student2= (Student) context.getBean("student"); // 測試student1,h和student2d的地址是否一致 System.out.println(student1); System.out.println(student2); // 當(dāng) scope="singleton" /**輸出結(jié)果地址一致(哈希值) *無參構(gòu)造函數(shù)被使用 * entity.Student@78186a70 * entity.Student@78186a70 */ } }
在輸出的結(jié)果中我們可以看出,當(dāng)設(shè)置為singleton時,加載的兩個Student的哈希值一致,同時無參構(gòu)造函數(shù)被調(diào)用一次,如果通過斷點(diǎn)測試可以發(fā)現(xiàn)在加載文件時,無參構(gòu)造函數(shù)就已經(jīng)被調(diào)用(如下圖)
總結(jié):Bean的實(shí)例化的個數(shù):1個
- bean的實(shí)例化時機(jī):當(dāng)spring核心文件被加載是,實(shí)例化配置的bean實(shí)例。
- 對象運(yùn)行;只要容器在對象就一直活著
- 對象銷毀:當(dāng)應(yīng)用卸載或者銷毀容器時,對象被銷毀
接著我們再看prototype
2.prototype
代碼如下(示例):
package test; import entity.Student; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringTest { @Test // 測試scope屬性,scope="singleton" public void test1(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Student student1= (Student) context.getBean("student"); Student student2= (Student) context.getBean("student"); // 測試student1,h和student2d的地址是否一致 System.out.println(student1); System.out.println(student2); // 當(dāng) scope="prototype" /** * 輸出結(jié)果 * 無參構(gòu)造函數(shù)被使用 * 無參構(gòu)造函數(shù)被使用 * entity.Student@67b467e9 * entity.Student@47db50c5 * */ } }
首先在測試結(jié)果中,我們可以看出,兩個Student的哈希值不一致,而且無參構(gòu)造函數(shù)被執(zhí)行了兩次,接著我們在用斷點(diǎn)測試一下
從測試的結(jié)果來看,此時的無參構(gòu)造函數(shù)是在實(shí)例化Student的時候被調(diào)用的。我看到過一個大佬舉的一個例子,我來引用一下 “如同分蘋果,將蘋果的bean的scope屬性聲明為prototype,在每個人領(lǐng)取蘋果的時候,我們都是發(fā)一個新的蘋果給他,發(fā)完之后,別人愛怎么吃就怎么吃,愛什么時候吃什么時候吃,但是注意吃完要把蘋果核扔到垃圾箱!對于那些不能共享使用的對象類型,應(yīng)該將其定義的scope設(shè)為prototype。”
總結(jié):Bean的實(shí)例化的個數(shù):多個
- bean的實(shí)例化時機(jī):當(dāng)spring核心文件被加載是,實(shí)例化配置的bean實(shí)例。
- 對象運(yùn)行;只對象在就一直活著
- 對象銷毀:當(dāng)對象長時間不用時,被java的垃圾回收了
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中的可變參數(shù)常見用法實(shí)例總結(jié)
這篇文章主要介紹了Java中的可變參數(shù)常見用法,結(jié)合實(shí)例形式總結(jié)分析了java可變參數(shù)的常見功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-10-10Jasypt的StandardPBEByteEncryptor使用源碼解析
這篇文章主要介紹了Jasypt的StandardPBEByteEncryptor使用源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Java 生成隨機(jī)單據(jù)號的實(shí)現(xiàn)示例
本文主要介紹了Java 生成隨機(jī)單據(jù)號的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09Java中位運(yùn)算(移位、位與、或、異或、非) 的簡單實(shí)例
Java中位運(yùn)算(移位、位與、或、異或、非) 的簡單實(shí)例,需要的朋友可以參考一下2013-02-02jdk-logging?log4j?logback日志系統(tǒng)實(shí)現(xiàn)機(jī)制原理介紹
這篇文章主要介紹了jdk-logging、log4j、logback日志介紹以及三個日志系統(tǒng)的實(shí)現(xiàn)機(jī)制,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03