我正在学习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