26

我正在学习 Spring 框架,目前正在阅读一本关于它的书。在这本书中,它说 Spring 单例与 Java 单例不同?这是什么意思,有什么区别?谢谢

4

2 回答 2

33

Java 单例由 Java 类加载器限定,Spring 单例由容器上下文限定。

这基本上意味着,在 Java 中,您可以确定单例仅在加载它的类加载器的上下文中才是真正的单例。其他类加载器应该能够创建它的另一个实例(假设类加载器不在同一个类加载器层次结构中),尽管您在代码中努力试图阻止它。

在 Spring 中,如果您可以在两个不同的上下文中加载单例类,那么我们可以再次打破单例概念。

因此,总而言之,如果 Java 不能在给定的类加载器中创建该类的多个实例,则 Java 将其视为单例,而 Spring 如果不能在给定容器中创建多个类的实例,则将其视为单例/语境。

于 2013-03-06T16:08:57.700 回答
4

一个 Java 单例,根据设计模式,实例化被限制为一个,通常是每个JVM类加载器的代码。维基百科

Spring 单例 bean 可以是您编写的任何普通类,但将其范围声明为单例意味着 Spring 将仅创建一个实例并提供对所有引用已声明 bean 的 bean 的引用。您的应用程序中可能有该类的许多实例,但只会为该 bean创建一个。您甚至可以将多个同一个类的 bean 都声明为单例。每个 bean 都将创建该类的一个实例。 Spring 3.1 文档

于 2013-03-06T16:10:12.110 回答