Spring中@Scope的幾種取值方式
@Scope的幾種取值
1、singleton:一個Spring容器中只有一個Bean的實例,此為Spring的默認(rèn)配置,全容器共享一個實例
2、prototype:每次調(diào)用新建一個Bean的實例
3、Request:Web項目中,給每一個http request新建一個Bean實例
4、Session:Web項目中,給每一個http session新建一個Bean實例。
5、GlobalSession:這個只在portal應(yīng)用中有用,給每一個global http session新建一個Bean實例。
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,增強另外三種:request,session和global session類型,它們只實用于web程序,通常是和XmlWebApplicationContext共同使用。
三、scope取值
1.singleton
此取值時表明容器中創(chuàng)建時只存在一個實例,所有引用此bean都是單一實例。用代碼實例
代碼如下(示例):
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)用一次,如果通過斷點測試可以發(fā)現(xiàn)在加載文件時,無參構(gòu)造函數(shù)就已經(jīng)被調(diào)用(如下圖)

總結(jié):Bean的實例化的個數(shù):1個
- bean的實例化時機:當(dāng)spring核心文件被加載是,實例化配置的bean實例。
- 對象運行;只要容器在對象就一直活著
- 對象銷毀:當(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í)行了兩次,接著我們在用斷點測試一下

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

