我正在學習Spring框架,並正在閱讀一本關於它的書。 在這本書中,它說Spring單例與Java單例不同? 這是什麼意思,有什麼區別? 謝謝Spring singleton和Java singeleton(設計模式)有什麼區別?
回答
Java單例的範圍是Java類加載器,Spring單例的範圍是容器上下文。
這基本上意味着,在Java中,你可以確定一個單例是一個真正的單例,只有在加載它的類加載器的上下文中。其他類加載器應該能夠創建它的另一個實例(儘管類加載器不在相同的類加載器層次結構中),儘管您在代碼中嘗試阻止它的所有努力。在Spring中,如果你可以在兩個不同的上下文中加載你的單例類,然後我們可以再次打破單例的概念。
總而言之,如果Java在一個給定的類加載器中不能創建多於一個該類的實例,那麼Java會認爲它是單例,而如果Spring不能在類中創建多個類的實例給定的容器/上下文。
如果您在具有不同bean ID的同一個bean定義/配置中聲明同一個類,那麼您將在「上下文中」使用同一個類的兩個不同實例。如果他打算在上下文/容器中使用單例,這可以解釋爲開發人員在配置中的錯誤。如果我錯了,請不要指責Spring,不要責怪Spring。 – user104309 2016-04-03 19:57:09
@ user104309:即使您在兩次不同的時間聲明同一個bean,它也只會創建一次。 Spring足夠聰明來處理這個問題,當你試圖通過ID獲取實例時,你可以進行「==」比較併爲自己測試。 – nanosoft 2016-06-28 15:37:25
@Edwin Dalorzo:我看你用「容器/上下文」來解釋春天的單身人士,這可能會讓一些人感到困惑。由於spring bean對於容器是單身的,但可能不適用於上下文(即應用程序)。 – nanosoft 2016-06-28 15:38:27
一個Java單例,每個設計模式的實例化被限制爲一個,通常根據代碼的類加載器通常使用
JVM
。 Wikipedia
一個Spring單例的bean可以是你寫的任何普通類,但在宣佈它的範圍,因爲單身意味着春天將只創建一個實例,並引用該聲明豆豆類都提供了參考。您的應用程序中可能有許多該類的實例,但只有一個將爲創建,即。你甚至可能擁有多個聲明爲singleton的同一類的bean。每個bean將創建該類的一個實例。 Spring 3.1 Doc
+1,儘管你陷入了在同一段中寫入「Spring單例類」的陷阱,因爲它解釋了Spring只有singleton * beans *,而不是singleton * classes *。 ;-) – ruakh 2013-03-06 16:12:39
@ruakh好,趕快,謝謝。 – 2013-03-06 16:13:30
實際上是通過類加載器,而不是通過JVM。一個JVM可能有幾個類加載器,它們中的每一個都可能有一個單例類的實例(假設它們不在同一個類加載器層次結構中)。 – 2013-03-06 16:17:15
- 1. 設計模式和架構模式有什麼區別?
- 2. 的Java Singleton設計模式
- 3. Singleton Pattern和Synchronized有什麼區別
- 4. 工廠和管道設計模式有什麼區別?
- 5. 界面和設計模式有什麼區別?
- 6. 設計模式和庫之間有什麼區別?
- 7. 策略和工廠設計模式有什麼區別?
- 8. Facade和Gateway設計模式有什麼區別?
- 9. 設計和建築模式有什麼區別
- 10. 有關Singleton設計模式和C#
- 11. Singleton設計模式
- 12. Singleton設計模式
- 13. DAO和DP模式有什麼區別?
- 14. 「::」和「sys」模式有什麼區別?
- 15. Factory和Strategy模式有什麼區別?
- 16. Oracle和Microsoft模式有什麼區別?
- 17. GOF和GRASP設計模式之間的區別是什麼
- 18. Singleton設計模式vs Spring中的Singleton bean容器
- 19. 什麼是System.Lazy <T>和Singleton設計模式
- 20. 數據設計和數據模型(ERD)有什麼區別
- 21. 佈局與設計有什麼區別?
- 22. Spring CGLIB和CGLIB有什麼區別?
- 23. DAO和Spring Beans有什麼區別?
- 24. Spring BeanFactoryAware和ApplicationContextAware有什麼區別?
- 25. Spring-WS WebServiceTemplate:HttpUrlConnectionMessageSender和HttpComponentsMessageSender有什麼區別?
- 26. Spring和Spring.net有什麼區別嗎?
- 27. 靜態類和單例類的設計模式有什麼區別?
- 28. 策略設計模式與抽象工廠模式有什麼區別?
- 29. **/*。java和* .java有什麼區別?
- 30. `java -version`和`java -showversion`有什麼區別?
您已經很好地理解了與其他響應的區別,但這裏是我爲什麼不想要Java單例測試性的兩個分。當你編寫單元測試時,會不會導致單例累積狀態信息的問題? – 2013-03-07 17:53:56