?一、前言:Bean對象簡介
在Spring項目中,那些由Spring?IoC容器所管理的對象,稱為bean。簡單地講,bean就是由Spring容器初始化、裝配及管理的對象,除此之外,bean就與應用程序中的其他對象沒有什么區(qū)別了。?而bean定義以及bean相互間的依賴關(guān)系將通過配置元數(shù)據(jù)來描述。
上一段描述簡析: spring的bean對象和普通java對象的區(qū)別就是spring的bean對象由spring創(chuàng)建,spring容器管理,spring實現(xiàn)裝配(注入)。 普通java對象是指沒有使用spring框架時,創(chuàng)建,管理,裝配(注入)是由開發(fā)人員自己完成的。
二、Bean對象的5個作用域:
???編程人員可以控制bean對象的作用域(就是bean對象的作用范圍)。主要就是控制某個bean對象的可用范圍。
1.Prototype(原型模式)的效果是每次服務(wù)端用getBean方法獲取同一個類的bean對象時都會創(chuàng)建一個新的bean對象。(prototype模式不會共享bean對象的狀態(tài),適用于每次操作的Bean對象都是不同狀態(tài)的情況或者需要頻繁創(chuàng)建新實例的情況)
2.而第二種request模式的效果是每次客戶端發(fā)出Http請求才創(chuàng)建一個bean對象。 相比較而言Prototype原型模式會相對更頻繁的創(chuàng)建對象,而request模式是一次復雜Http請求處理完畢,第二次Http請求才創(chuàng)建一個新的同類型的bean對象(request模式下:每個bean對象對于一個Http請求是唯一的)。 ?舉例:Prototype原型模式就相當于吃花生豆,每次張嘴吃的都是不同的花生豆。 ?Request模式就相當于小孩吃大餅干,一次吃大餅干一次請求吃的是同一個餅干(直到餅干吃完了,小孩再向大人發(fā)起第二次請求才會吃到第二塊餅干)。?
3.session模式相比較request模式而言,request模式創(chuàng)建bean對象會相對更加頻繁。 因為request是客戶端每次發(fā)出Http請求都會創(chuàng)建一個新的bean對象。而session模式指的是客戶端和服務(wù)端一次通信完畢。此客戶端在一段有效的時間內(nèi)沒有再發(fā)出請求則都屬于一個session范圍,不會創(chuàng)建第二個bean對象(在此有效的時間內(nèi)客戶端可以發(fā)出多次Http請求)。 所以session模式比request模式的bean對象作用域更大,bean對象創(chuàng)建頻率相對較少。?舉例:session模式就相當于小孩吃一鍋米飯,在吃同一頓飯的時間內(nèi),小孩向大人發(fā)出多次吃飯請求,吃的都是同一鍋飯(直到這頓飯吃飯,到下一次吃飯的會話<下一頓飯的時間>才會制造第二鍋飯)(session模式是同一個會話內(nèi)多次請求使用的是同一個bean對象,同一個吃飯時間內(nèi)多次舀飯,舀的是同一鍋飯)(適用于保存用戶特定的數(shù)據(jù)或狀態(tài))。
???4.Golobal Session模式:在整個Portlet規(guī)范的web項目中,只會創(chuàng)建一個全局會話的Bean對象(一個Portlet規(guī)范的web項目保持一個bean對象)。注意:spring項目中沒有Golobal Session模式。 舉例: 飯店賣飯,多個家庭可以都吃一鍋內(nèi)的飯, 而且一鍋飯可以賣好幾頓(比如一大鍋稀飯,早上中午都售賣)Golobal Session模式比session模式的作用域更大。?(Golobal Session模式對應一個項目一個類只有一個bean對象, 而session模式是一個項目內(nèi)同一個客戶端在某個有效的時間內(nèi)訪問的是同一個bean對象<如果超出這個有效時間此客戶端訪問本項目時,同一個bean對象會創(chuàng)建不同的bean對象>)
??5.singleton模式:同一個bean對象在同一個spring容器中只創(chuàng)建一份兒。Bean對象是全局共享的,適用于無狀態(tài)的Bean或者需要在多個組件之間共享數(shù)據(jù)的情況。 我的理解:和上邊的Golobal Session模式類似(設(shè)置了singleton模式的bean對象,在一個web項目中只有一份兒)
?
其中request、session、和golobalSession三種模式只適用于WebApplica
tionContext上下文環(huán)境(就是只適用于web項目)。 而singleton和prototype兩個作用域適用于任何類型的項目。
?
五大作用域范圍對比
?
總結(jié), 5種作用域的大小: ?prototype < request < session < golobal session < singleton ?
我的理解: 在spring項目中只需要記憶prototype < request < session ?< singleton。 因為golobal session不適用于spring項目,而且我認為golobal session 和 singleton都是在一個項目中只保留一個bean對象。
By? zhaoYongQi? ? ? 2024/03/07? 17:37
?
?
?
三、知識點精簡:
以內(nèi)內(nèi)容的來源于網(wǎng)絡(luò),文章鏈接如下(如有冒犯,請留言):
下面是網(wǎng)上一篇比較精簡的文章,方便快速理解:
1.Singleton(單例):默認的作用域
在整個應用程序中只創(chuàng)建一個Bean實例。
所有對該Bean的請求都將返回同一個實例。
Bean是全局共享的,適用于無狀態(tài)的Bean或者需要在多個組件之間共享數(shù)據(jù)的情況。
2.Prototype(原型)
每次對Bean的請求都會創(chuàng)建一個新的實例。
沒有共享狀態(tài),適用于有狀態(tài)的Bean或者需要頻繁創(chuàng)建新實例的情況
3.Request(請求)
在每個HTTP請求中創(chuàng)建一個新的Bean實例。
每個請求的Bean實例對于該請求是唯一的。
僅在Web應用程序的上下文中有效,適用于處理HTTP請求的控制器或服務(wù)。
4.Session(會話)
在每個用戶會話(Session)中創(chuàng)建一個新的Bean實例。
對于同一用戶的所有請求,都將使用相同的Bean實例。
僅在Web應用程序的上下文中有效,適用于保存用戶特定的數(shù)據(jù)或狀態(tài)。
5.Global Session(全局會話)文章來源:http://www.zghlxwxcb.cn/news/detail-837896.html
在整個應用程序的全局會話中創(chuàng)建一個新的Bean實例。
僅在基于Portlet的Web應用程序中有效,通常與Portlet會話一起使用。文章來源地址http://www.zghlxwxcb.cn/news/detail-837896.html
到了這里,關(guān)于Spring框架Bean對象的五個作用域的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!