淺談Spring單例Bean與單例模式的區(qū)別
Spring單例Bean與單例模式的區(qū)別在于它們關(guān)聯(lián)的環(huán)境不一樣,單例模式是指在一個(gè)JVM進(jìn)程中僅有一個(gè)實(shí)例,而Spring單例是指一個(gè)Spring Bean容器(ApplicationContext)中僅有一個(gè)實(shí)例。
首先看單例模式,在一個(gè)JVM進(jìn)程中(理論上,一個(gè)運(yùn)行的JAVA程序就必定有自己一個(gè)獨(dú)立的JVM)僅有一個(gè)實(shí)例,于是無(wú)論在程序中的何處獲取實(shí)例,始終都返回同一個(gè)對(duì)象,以Java內(nèi)置的Runtime為例(現(xiàn)在枚舉是單例模式的最佳實(shí)踐),無(wú)論何時(shí)何處獲取,下面的判斷始終為真:
// 基于懶漢模式實(shí)現(xiàn) // 在一個(gè)JVM實(shí)例中始終只有一個(gè)實(shí)例 Runtime.getRuntime() == Runtime.getRuntime()
與此相比,Spring的單例Bean是與其容器(ApplicationContext)密切相關(guān)的,所以在一個(gè)JVM進(jìn)程中,如果有多個(gè)Spring容器,即使是單例bean,也一定會(huì)創(chuàng)建多個(gè)實(shí)例,代碼示例如下:
// 第一個(gè)Spring Bean容器 ApplicationContext context_1 = new FileSystemXmlApplicationContext("classpath:/ApplicationContext.xml"); Person yiifaa_1 = context_1.getBean("yiifaa", Person.class); // 第二個(gè)Spring Bean容器 ApplicationContext context_2 = new FileSystemXmlApplicationContext("classpath:/ApplicationContext.xml"); Person yiifaa_2 = context_2.getBean("yiifaa", Person.class); // 這里絕對(duì)不會(huì)相等,因?yàn)閯?chuàng)建了多個(gè)實(shí)例 System.out.println(yiifaa_1 == yiifaa_2);
以下是Spring的配置文件:
<!-- 即使聲明了為單例,只要有多個(gè)容器,也一定會(huì)創(chuàng)建多個(gè)實(shí)例 --> <bean id="yiifaa" class="com.stixu.anno.Person" scope="singleton"> <constructor-arg name="username"> <value>yiifaa</value> </constructor-arg> </bean>
總結(jié)
Spring的單例bean與Spring bean管理容器密切相關(guān),每個(gè)容器都會(huì)創(chuàng)建自己獨(dú)有的實(shí)例,所以與GOF設(shè)計(jì)模式中的單例模式相差極大,但在實(shí)際應(yīng)用中,如果將對(duì)象的生命周期完全交給Spring管理(不在其他地方通過(guò)new、反射等方式創(chuàng)建),其實(shí)也能達(dá)到單例模式的效果。
以上就是本文關(guān)于淺談Spring單例Bean與單例模式的區(qū)別的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
Spring MVC獲取參數(shù)和自定義參數(shù)類型轉(zhuǎn)換器及編碼過(guò)濾器
這篇文章主要為大家詳細(xì)介紹了Spring MVC獲取參數(shù)和自定義參數(shù)類型轉(zhuǎn)換器及編碼過(guò)濾器,文中通過(guò)代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-06-06詳解IntelliJ IDEA創(chuàng)建spark項(xiàng)目的兩種方式
這篇文章主要介紹了詳解IntelliJ IDEA創(chuàng)建spark項(xiàng)目的兩種方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01springboot實(shí)現(xiàn)將自定義日志格式存儲(chǔ)到mongodb中
這篇文章主要介紹了springboot實(shí)現(xiàn)將自定義日志格式存儲(chǔ)到mongodb中的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07解決DataInputStream?read不等于-1,socket文件傳輸只能傳輸一個(gè)文件無(wú)法傳輸多個(gè)問(wèn)題
這篇文章主要介紹了解決DataInputStream?read不等于-1,socket文件傳輸只能傳輸一個(gè)文件無(wú)法傳輸多個(gè)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08淺談一下數(shù)據(jù)庫(kù)連接池Druid德魯伊
數(shù)據(jù)庫(kù)連接池就是一個(gè)容器持有多個(gè)數(shù)據(jù)庫(kù)連接,當(dāng)程序需要操作數(shù)據(jù)庫(kù)的時(shí)候直接從池中取出連接,使用完之后再還回去,和線程池一個(gè)道理,需要的朋友可以參考下2023-05-05一文帶你探究Spring中Bean的線程安全性問(wèn)題
很多人都想spring中的bean是線程安全的嗎?本文將帶你探究Spring中Bean的線程安全性問(wèn)題,感興趣的同學(xué)可以參考閱讀下2023-05-05你應(yīng)該知道的21個(gè)Java核心技術(shù)
Java的21個(gè)核心技術(shù)點(diǎn),你知道嗎?這篇文章主要為大家詳細(xì)介紹了Java核心技術(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08