Spring?Bean中的六種作用域你了解嗎
一、作用域是什么
Bean的作用域是指Bean實例的生命周期及可見性范圍,Spring框架定義了以下6種作用域:
1.singleton:單例作用域,所有對該Bean的請求都返回同一個Bean實例。
2.prototype:原型作用域,每次請求時都創(chuàng)建一個新的Bean實例。
3.request:請求作用域,每個HTTP請求都會創(chuàng)建一個新的Bean實例,該Bean實例僅在當(dāng)前請求內(nèi)有效。
4.session:會話作用域,每個HTTP會話都會創(chuàng)建一個新的Bean實例,該Bean實例僅在當(dāng)前會話內(nèi)有效。
5.application:全局作用域,一個bean 定義對應(yīng)于單個ServletContext 的生命周期。
6.websocket: HTTP WebSocket 作用域,一個bean 定義對應(yīng)于單個websocket 的生命周期。
選擇適當(dāng)?shù)淖饔糜蚩梢蕴岣邞?yīng)用程序的性能和可維護性。
下面用一個例子來解釋Bean的作用域:你和別人一起協(xié)同開發(fā)的代碼中有個Bean不想別人改動,那就可以通過調(diào)整Bean的作用域來解決.
下面有兩個用戶張三和李四,張三呢 調(diào)用了公共對象,但是張三特意使用了 user2來接收,
此時李四也想使用這個對象;然后他們一起調(diào)用了,但是發(fā)現(xiàn)李四調(diào)用的時候這個Name也被修改成小貓了.這是為什么呢 張三明顯創(chuàng)建了一個新對象
其實真實的情況是Spring的IoC容器有兩種作用域模式,一種是IoC默認的singleton(單例作用域),一種是可手動修改的prototype(原型作用域 / 多例作用域),在默認情況下,IoC容器采用singleton,也就是所有人獲取到的都是同一個Bean對象,這樣效率會高很多.
所以當(dāng)我們使用原型模式時這個問題就解決了
//張三
@Controller
public class UserController2 {
@Autowired
private User user;
public void doMethod() {
User user2 = user;
System.out.println("UserController2 修改之前:User -> " + user);
user2.setName("小貓");
System.out.println("UserController2 修改之后:User -> " + user);
}
}//李四
@Controller
public class UserController3 {
@Autowired
private User user;
public void doMethod() {
System.out.println("UserController3:user -> " + user);
}
}1、singleton(單例作用域)
官?說明:(Default) Scopes a single bean definition to a single object instance for each Spring IoC container.
描述:該作?域下的Bean在IoC容器中只存在?個實例:獲取Bean(即通過applicationContext.getBean等?法獲取)及裝配Bean(即通過@Autowired注?)都是同?個對象。
場景:通常?狀態(tài)的Bean使?該作?域。?狀態(tài)表示Bean對象的屬性狀態(tài)不需要更新
備注:Spring默認選擇該作?域
2、prototype(原型作用域)
官?說明:Scopes a single bean definition to any number of object instances.
描述:每次對該作?域下的Bean的請求都會創(chuàng)建新的實例:獲取Bean(即通過applicationContext.getBean等?法獲取)及裝配Bean(即通過@Autowired注?)都是新的對象實例。
場景:通常有狀態(tài)的Bean使?該作?域

上圖中,每個引用對應(yīng)一個新的 bean 實例。
請注意,上圖中的例子不適用于生產(chǎn)環(huán)境。因為 DAO 通常來說是無狀態(tài)的 bean ,應(yīng)該指定它的作用域為 singleton 比較合適
3、request(請求作用域)
官?說明:Scopes a single bean definition to the lifecycle of a single HTTP request. That is, each HTTP request has its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext.
描述:每次http請求會創(chuàng)建新的Bean實例,類似于prototype
場景:?次http的請求和響應(yīng)的共享Bean
備注:限定SpringMVC中使?
4、session(回話作用域)
官?說明:Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext.
描述:在?個http session中,定義?個Bean實例
場景:?戶回話的共享Bean, ?如:記錄?個?戶的登陸信息
備注:限定SpringMVC中使?
5、application(全局作用域)
官?說明:Scopes a single bean definition to the lifecycle of a ServletContext. Only valid in the context of a web-aware Spring ApplicationContext.
描述:在?個http servlet Context中,定義?個Bean實例
場景:Web應(yīng)?的上下?信息,?如:記錄?個應(yīng)?的共享信息
備注:限定SpringMVC中使?
6、websocket( HTTP WebSocket 作用域)
官?說明:Scopes a single bean definition to the lifecycle of a WebSocket. Only valid in the context of a web-aware Spring ApplicationContext.
描述:在?個HTTP WebSocket的?命周期中,定義?個Bean實例
場景:WebSocket的每次會話中,保存了?個Map結(jié)構(gòu)的頭信息,將?來包裹客戶端消息頭。第?次初始化后,直到WebSocket結(jié)束都是同?個Bean。
備注:限定Spring WebSocket中使?
二、單例作?域VS 全局作?域
- singleton 是 Spring Core 的作?域;application 是 Spring Web 中的作?域;
- singleton 作?于 IoC 的容器,? application 作?于 Servlet 容器。
三、設(shè)置作用域
singleton 作用域是 Spring 中默認的作用域,
使? @Scope 標(biāo)簽就可以?來聲明 Bean 的作?域,?如設(shè)置 Bean 的作?域,如下代碼所示:
@Component
public class Users {
@Scope(prototype)
@Bean(name = "u")
public User user() {
User user = new User();
user.setId(1);
user.setName("Hi user");
return user;
}
}@Scope 標(biāo)簽既可以修飾?法也可以修飾類,@Scope 有兩種設(shè)置?式:
1. 直接設(shè)置值:@Scope("prototype")
2. 使?枚舉設(shè)置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
以上就是Spring Bean中的六種作用域你了解嗎的詳細內(nèi)容,更多關(guān)于Bean作用域的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring Boot開發(fā)編譯后讀取不到@spring.profiles.active@的問題及解決步驟
這篇文章主要介紹了Spring Boot開發(fā)編譯后讀取不到@spring.profiles.active@的問題及解決步驟,需要的朋友可以參考下2024-12-12
MyBatis實現(xiàn)兩種查詢樹形數(shù)據(jù)的方法詳解(嵌套結(jié)果集和遞歸查詢)
樹形結(jié)構(gòu)數(shù)據(jù)在開發(fā)中十分常見,比如:菜單數(shù)、組織樹, 利用 MyBatis 提供嵌套查詢功能可以很方便地實現(xiàn)這個功能需求。本文主要介紹了兩種方法,感興趣的可以了解一下2021-09-09
Jmeter?BlazeMeter實現(xiàn)web錄制過程
BlazeMeter是一款與Apache JMeter兼容的chrome插件,采用BlazeMeter可以方便的進行流量錄制和腳本生成,作為接口測試腳本編寫的一個基礎(chǔ),這篇文章主要介紹了Jmeter?BlazeMeter實現(xiàn)web錄制,需要的朋友可以參考下2021-12-12
深入學(xué)習(xí)springboot線程池的使用和擴展
這篇文章主要介紹了深入學(xué)習(xí)springboot線程池的使用和擴展,springboot框架提供了@Async注解,幫助我們更方便的將業(yè)務(wù)邏輯提交到線程池中異步執(zhí)行,需要的朋友可以參考下2019-06-06
MybatisPlus實現(xiàn)數(shù)據(jù)權(quán)限隔離的示例詳解
Mybatis Plus對Mybatis做了無侵入的增強,非常的好用,今天就給大家介紹它的其中一個實用功能:數(shù)據(jù)權(quán)限插件,感興趣的可以跟隨小編一起了解下2024-04-04

