我正在学习Spring框架,并且正在阅读一本相关的书籍。在这本书中提到,Spring单例与Java单例不同。这是什么意思,有哪些区别?谢谢。
我正在学习Spring框架,并且正在阅读一本相关的书籍。在这本书中提到,Spring单例与Java单例不同。这是什么意思,有哪些区别?谢谢。
Java的单例模式是由Java类加载器作用域限定的,而Spring的单例模式是由容器上下文作用域限定的。
这基本意味着,在Java中,你只能确保一个单例模式在加载它的类加载器上下文中是真正的单例模式。其他类加载器可以创建另一个该类的实例(前提条件是这些类加载器不在同一个类加载器层次结构中),即使你在代码中尝试了各种努力防止这种情况的发生。
在Spring中,如果您把单例类加载到两个不同的上下文中,那么就可能再次打破单例模式的概念。
因此,总之,Java认为如果在给定的类加载器中不能创建该类的多个实例,则认为该类是单例模式,而Spring则认为如果在给定的容器/上下文中不能创建该类的多个实例,则认为该类是单例模式。
Java的单例是一种设计模式,通过代码将实例化限制为一个(通常是每个类加载器)。 维基百科
Spring的单例bean可以是您编写的任何普通类,但将其范围声明为单例意味着Spring只会创建一个实例并将其引用提供给引用所声明的所有bean。您的应用程序中可能有许多该类的实例,但仅为该bean创建一个。您甚至可以将同一类的多个bean都声明为单例。每个bean将创建该类的正好一个实例。Spring 3.1文档
a.getClass() == b.getClass()
将为false
。(此外,您可以拥有一个“单例类”,即使在单个类加载器中也有多个实例,出于各种原因。) - ruakh