我想知道 Spring 中的单例 bean(用 @Scope(value="singleton")
注释)的生命周期是如何精确定义的。
具体来说,是否保证在同一个 ApplicationContext
中对该 bean 的连续查找返回相同的 bean 对象实例?
最佳答案
是的,这就是singleton
范围的定义:每次调用getBean()
时仅返回一个实例。请注意,非惰性 singleton
是 Spring 中的默认作用域。
此外,如果 singleton 被定义为惰性并且没有其他非惰性 bean 引用它,则它将在第一次显式查找期间创建。
编辑:回答您的评论:有时您可能会发现您的单例被创建了两次。以这个bean为例:
@Service
@Transactional
public class Singleton {
public Singleton() {
System.out.println("Created: " + this.getClass());
}
}
即使这是一个单例,您的程序也可能会产生以下输出:
Created: class com.example.Singleton
Created: class com.example.Singleton$$EnhancerByCGLIB$$f8ccc422
构造函数已被调用两次 - 一次是针对原始类,第二次是针对由 CGLIB 创建的类,以在没有任何接口(interface)的类上实现代理。为了保留 Singleton
公共(public)接口(interface),CGLIB 生成的类必须从原始类派生子类。这样,CGLIB 类就可以用在需要 Singleton
的地方(多态性)。但子类必须调用基类构造函数,因此需要两次构造函数调用。
但别担心,CGLIB 生成的类只是一个 stub ,它将所有调用重定向到“普通”bean,同时应用 AOP 内容。
关于Spring单例bean生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6681907/