Spring单例bean生命周期
我想知道Spring中单例bean(用Spring单例bean生命周期,spring,Spring,我想知道Spring中单例bean(用@Scope(value=“singleton”)注释)的生命周期是如何精确定义的 具体地说,是否保证在相同的ApplicationContext连续查找该bean时返回相同的bean对象实例?是的,这就是单例范围的定义:每次调用getBean()只返回一个实例。请注意,Spring中的默认作用域是非惰性singleton 另外,如果singleton被定义为lazy,并且没有其他非lazy bean引用它,那么它将在第一次显式查找期间创建 编辑:回答您的评
@Scope(value=“singleton”)
注释)的生命周期是如何精确定义的
具体地说,是否保证在相同的
ApplicationContext
连续查找该bean时返回相同的bean对象实例?是的,这就是单例
范围的定义:每次调用getBean()
只返回一个实例。请注意,Spring中的默认作用域是非惰性singleton
另外,如果singleton被定义为lazy,并且没有其他非lazy bean引用它,那么它将在第一次显式查找期间创建
编辑:回答您的评论:有时您可能会发现您的singleton被创建了两次。以这个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
public接口,CGLIB生成的类必须是原始类的子类。这样,CGLIB类可以在需要Singleton
的地方使用(多态性)。但子类必须调用基类构造函数,因此需要调用两个构造函数
但别担心,CGLIB生成的类只是一个存根,它将所有调用重定向到一个“普通”bean,同时应用AOP的东西 嗯。。。真奇怪。虽然您的回答证实了我的预期,但我偶尔会看到给定单例bean实例的两个实例(在未知的条件下)。有几种可能性:您有两个应用程序上下文,它们都选择相同的类(通常出现在SpringMVC应用程序中,父上下文不必要地创建了重复的控制器);我将在回答中解释第二个原因。