2013-03-06 78 views
14

我正在學習Spring框架,並正在閱讀一本關於它的書。 在這本書中,它說Spring單例與Java單例不同? 這是什麼意思,有什麼區別? 謝謝Spring singleton和Java singeleton(設計模式)有什麼區別?

+0

您已經很好地理解了與其他響應的區別,但這裏是我爲什麼不想要Java單例測試性的兩個分。當你編寫單元測試時,會不會導致單例累積狀態信息的問題? – 2013-03-07 17:53:56

回答

18

Java單例的範圍是Java類加載器,Spring單例的範圍是容器上下文。

這基本上意味着,在Java中,你可以確定一個單例是一個真正的單例,只有在加載它的類加載器的上下文中。其他類加載器應該能夠創建它的另一個實例(儘管類加載器不在相同的類加載器層次結構中),儘管您在代碼中嘗試阻止它的所有努力。在Spring中,如果你可以在兩個不同的上下文中加載你的單例類,然後我們可以再次打破單例的概念。

總而言之,如果Java在一個給定的類加載器中不能創建多於一個該類的實例,那麼Java會認爲它是單例,而如果Spring不能在類中創建多個類的實例給定的容器/上下文。

+0

如果您在具有不同bean ID的同一個bean定義/配置中聲明同一個類,那麼您將在「上下文中」使用同一個類的兩個不同實例。如果他打算在上下文/容器中使用單例,這可以解釋爲開發人員在配置中的錯誤。如果我錯了,請不要指責Spring,不要責怪Spring。 – user104309 2016-04-03 19:57:09

+0

@ user104309:即使您在兩次不同的時間聲明同一個bean,它也只會創建一次。 Spring足夠聰明來處理這個問題,當你試圖通過ID獲取實例時,你可以進行「==」比較併爲自己測試。 – nanosoft 2016-06-28 15:37:25

+0

@Edwin Dalorzo:我看你用「容器/上下文」來解釋春天的單身人士,這可能會讓一些人感到困惑。由於spring bean對於容器是單身的,但可能不適用於上下文(即應用程序)。 – nanosoft 2016-06-28 15:38:27

4

一個Java單例,每個設計模式的實例化被限制爲一個,通常根據代碼的類加載器通常使用 JVM Wikipedia

一個Spring單例的bean可以是你寫的任何普通類,但在宣佈它的範圍,因爲單身意味着春天將只創建一個實例,並引用該聲明豆豆類都提供了參考。您的應用程序中可能有許多該類的實例,但只有一個將爲創建,即。你甚至可能擁有多個聲明爲singleton的同一類的bean。每個bean將創建該類的一個實例。 Spring 3.1 Doc

+2

+1,儘管你陷入了在同一段中寫入「Spring單例類」的陷阱,因爲它解釋了Spring只有singleton * beans *,而不是singleton * classes *。 ;-) – ruakh 2013-03-06 16:12:39

+0

@ruakh好,趕快,謝謝。 – 2013-03-06 16:13:30

+1

實際上是通過類加載器,而不是通過JVM。一個JVM可能有幾個類加載器,它們中的每一個都可能有一個單例類的實例(假設它們不在同一個類加載器層次結構中)。 – 2013-03-06 16:17:15

相關問題