2013-03-06 42 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

相关问题