目錄
一、五種作用域
二、單例bean與原型bean的區(qū)別
?三、單例Bean的優(yōu)勢與劣勢
一、五種作用域
1.singleton:
singleton是Spring Bean的默認(rèn)作用域,也就是單例模式。在整個(gè)應(yīng)用程序中,只會(huì)創(chuàng)建一個(gè)實(shí)例,Bean的所有請(qǐng)求都會(huì)共享這個(gè)實(shí)例。
2.prototype:
prototype表示原型模式,每次請(qǐng)求都將創(chuàng)建一個(gè)新的Bean實(shí)例。因此,在應(yīng)用程序中可以有多個(gè)實(shí)例,這些實(shí)例之間不會(huì)相互影響。
3.request:
request表示在HTTP請(qǐng)求范圍內(nèi)創(chuàng)建Bean實(shí)例。每次發(fā)出HTTP請(qǐng)求時(shí),都會(huì)創(chuàng)建一個(gè)新的Bean實(shí)例,這個(gè)Bean實(shí)例只能在當(dāng)前請(qǐng)求中使用。
4.session:
session表示在HTTP會(huì)話范圍內(nèi)創(chuàng)建Bean實(shí)例。在一次會(huì)話期間,只會(huì)創(chuàng)建一個(gè)Bean實(shí)例。如果在同一個(gè)會(huì)話期間發(fā)出多個(gè)請(qǐng)求,這些請(qǐng)求都將共享同一個(gè)Bean實(shí)例。
5.globalsession:
globalsession表示在全局HTTP會(huì)話范圍內(nèi)創(chuàng)建Bean實(shí)例。這個(gè)作用域只適用于基于portlet的Web應(yīng)用程序。對(duì)于其他類型的Web應(yīng)用程序,globalsession作用域與session作用域是相同的。
二、單例bean與原型bean的區(qū)別
如果一個(gè)Bean被聲明為單例的時(shí)候,在處理多次請(qǐng)求的時(shí)候在Spring容器里面只實(shí)例化出一個(gè)Bean,后續(xù)的請(qǐng)求都公用這個(gè)對(duì)象,這個(gè)對(duì)象會(huì)保存到一個(gè)map里面。當(dāng)有請(qǐng)求進(jìn)來的時(shí)候,會(huì)先從緩存(map)里查看有沒有,有的話直接使用這個(gè)對(duì)象,沒有的話才實(shí)例化一個(gè)新的對(duì)象,所以這是個(gè)單例的。但是對(duì)于原型(prototype)bean來說,當(dāng)每次請(qǐng)求進(jìn)來的時(shí)候直接實(shí)例化新的bean,沒有緩存以及從緩存查的過程。
?三、單例Bean的優(yōu)勢與劣勢
優(yōu)勢:
1、減少了新生成實(shí)例的消耗:新生成實(shí)例消耗包括兩方面,第一,Spring會(huì)通過反射或者cglib來生成bean實(shí)例,這都是消耗性能的操作,其次給對(duì)象分配內(nèi)存也會(huì)涉及復(fù)雜算法。
2、減少jvm垃圾回收?:由于不會(huì)給每個(gè)請(qǐng)求都新生成bean實(shí)例,所以自然回收的對(duì)象少了。
3、可以快速獲取到 bean:因?yàn)閱卫墨@取bean操作除了第一次生成之外其余的都是從緩存里獲取的,所以很快。
劣勢:
單例的 bean一個(gè)很大的劣勢就是他不能做到線程安全!??!由于所有請(qǐng)求都共享一個(gè) bean實(shí)例,所以這個(gè) bean要是有狀態(tài)的一個(gè) bean的話可能在并發(fā)場景下出現(xiàn)問題,而原型的 bean則不會(huì)有這樣問題(但也有例外,比如他被單例 bean依賴),因?yàn)榻o每個(gè)請(qǐng)求都新創(chuàng)建實(shí)例。文章來源:http://www.zghlxwxcb.cn/news/detail-472054.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-472054.html
到了這里,關(guān)于Spring為什么默認(rèn)是單例的?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!