Spring中@Scope的幾種取值方式
@Scope的幾種取值
1、singleton:一個(gè)Spring容器中只有一個(gè)Bean的實(shí)例,此為Spring的默認(rèn)配置,全容器共享一個(gè)實(shí)例
2、prototype:每次調(diào)用新建一個(gè)Bean的實(shí)例
3、Request:Web項(xiàng)目中,給每一個(gè)http request新建一個(gè)Bean實(shí)例
4、Session:Web項(xiàng)目中,給每一個(gè)http session新建一個(gè)Bean實(shí)例。
5、GlobalSession:這個(gè)只在portal應(yīng)用中有用,給每一個(gè)global http session新建一個(gè)Bean實(shí)例。
Spring入門詳解scope屬性
一、scope屬性
spring中scope是一個(gè)非常關(guān)鍵的概念,簡(jiǎn)單說就是對(duì)象在spring容器(IOC容器)中的生命周期,也可以理解為對(duì)象在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
此取值時(shí)表明容器中創(chuàng)建時(shí)只存在一個(gè)實(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 + '\'' +
// '}';
// }
}測(cè)試代碼
package test;
import entity.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
@Test
// 測(cè)試scope屬性,scope="singleton"
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Student student1= (Student) context.getBean("student");
Student student2= (Student) context.getBean("student");
// 測(cè)試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時(shí),加載的兩個(gè)Student的哈希值一致,同時(shí)無參構(gòu)造函數(shù)被調(diào)用一次,如果通過斷點(diǎn)測(cè)試可以發(fā)現(xiàn)在加載文件時(shí),無參構(gòu)造函數(shù)就已經(jīng)被調(diào)用(如下圖)

總結(jié):Bean的實(shí)例化的個(gè)數(shù):1個(gè)
- bean的實(shí)例化時(shí)機(jī):當(dāng)spring核心文件被加載是,實(shí)例化配置的bean實(shí)例。
- 對(duì)象運(yùn)行;只要容器在對(duì)象就一直活著
- 對(duì)象銷毀:當(dāng)應(yīng)用卸載或者銷毀容器時(shí),對(duì)象被銷毀
接著我們?cè)倏磒rototype
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
// 測(cè)試scope屬性,scope="singleton"
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Student student1= (Student) context.getBean("student");
Student student2= (Student) context.getBean("student");
// 測(cè)試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
*
*/
}
}首先在測(cè)試結(jié)果中,我們可以看出,兩個(gè)Student的哈希值不一致,而且無參構(gòu)造函數(shù)被執(zhí)行了兩次,接著我們?cè)谟脭帱c(diǎn)測(cè)試一下

從測(cè)試的結(jié)果來看,此時(shí)的無參構(gòu)造函數(shù)是在實(shí)例化Student的時(shí)候被調(diào)用的。我看到過一個(gè)大佬舉的一個(gè)例子,我來引用一下 “如同分蘋果,將蘋果的bean的scope屬性聲明為prototype,在每個(gè)人領(lǐng)取蘋果的時(shí)候,我們都是發(fā)一個(gè)新的蘋果給他,發(fā)完之后,別人愛怎么吃就怎么吃,愛什么時(shí)候吃什么時(shí)候吃,但是注意吃完要把蘋果核扔到垃圾箱!對(duì)于那些不能共享使用的對(duì)象類型,應(yīng)該將其定義的scope設(shè)為prototype。”
總結(jié):Bean的實(shí)例化的個(gè)數(shù):多個(gè)
- bean的實(shí)例化時(shí)機(jī):當(dāng)spring核心文件被加載是,實(shí)例化配置的bean實(shí)例。
- 對(duì)象運(yùn)行;只對(duì)象在就一直活著
- 對(duì)象銷毀:當(dāng)對(duì)象長(zhǎng)時(shí)間不用時(shí),被java的垃圾回收了
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java鏈表中元素刪除的實(shí)現(xiàn)方法詳解【只刪除一個(gè)元素情況】
這篇文章主要介紹了Java鏈表中元素刪除的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了java只刪除鏈表中一個(gè)元素的相關(guān)操作原理、實(shí)現(xiàn)方法與注意事項(xiàng),需要的朋友可以參考下2020-03-03
基于Java實(shí)現(xiàn)簡(jiǎn)易的局域網(wǎng)對(duì)話系統(tǒng)
這篇文章主要介紹了基于Java實(shí)現(xiàn)的簡(jiǎn)易的局域網(wǎng)對(duì)話系統(tǒng),文中的示例代碼對(duì)我們學(xué)習(xí)Java有一定的幫助,感興趣的小伙伴快來跟隨小編一起學(xué)習(xí)一下吧2021-12-12
Java如何發(fā)起http請(qǐng)求的實(shí)現(xiàn)(GET/POST)
這篇文章主要介紹了Java如何發(fā)起http請(qǐng)求的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Java中對(duì)象快速?gòu)?fù)制的幾種方式詳解
這篇文章主要介紹了Java中對(duì)象快速?gòu)?fù)制的幾種方式詳解,對(duì)象的克隆是指創(chuàng)建一個(gè)新的對(duì)象,且新的對(duì)象的狀態(tài)與原始對(duì)象的狀態(tài)相同,當(dāng)對(duì)克隆的新對(duì)象進(jìn)行修改時(shí),不會(huì)影響原始對(duì)象的狀態(tài),需要的朋友可以參考下2023-08-08
Spring Boot 3.4.0 結(jié)合 Mybatis-plus 實(shí)
本文詳細(xì)介紹了在 Spring Boot 3.4.0 項(xiàng)目中結(jié)合 Mybatis-plus 實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的完整方案,通過自定義注解和AOP切面,我們可以優(yōu)雅地實(shí)現(xiàn)方法級(jí)別的數(shù)據(jù)源切換,滿足多數(shù)據(jù)源場(chǎng)景下的各種需求,感興趣的朋友一起看看吧2025-04-04
Spring Bean生命周期之Bean元信息的配置與解析階段詳解
這篇文章主要為大家詳細(xì)介紹了Spring Bean生命周期之Bean元信息的配置與解析階段,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
一篇文章帶你使用SpringBoot基于WebSocket的在線群聊實(shí)現(xiàn)
這篇文章主要介紹了一篇文章帶你使用SpringBoot基于WebSocket的在線群聊實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

