我想知道如何精确定义Spring中单例bean(用@Scope(value="singleton")
注释)的生命周期。
具体来说,是否保证在该bean的相同ApplicationContext
个连续查找中返回相同的bean对象实例?
答案 0 :(得分:2)
是的,这是singleton
范围的定义:每次调用getBean()
时只返回一个实例。请注意,非延迟singleton
是Spring中的默认范围。
此外,如果singleton被定义为lazy而没有其他非懒惰的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创建的类,以在没有任何接口的类上实现代理。为了保留Singleton
公共接口,CGLIB生成的类必须是原始类的子类。这样可以在期望Singleton
的地方使用CGLIB类(多态)。但是子类必须调用基类构造函数,因此调用两个构造函数。
但不要担心,CGLIB生成的类只是一个存根,它将所有调用重定向到“普通”bean,同时应用AOP内容。