Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring单例bean生命周期_Spring - Fatal编程技术网

Spring单例bean生命周期

Spring单例bean生命周期,spring,Spring,我想知道Spring中单例bean(用@Scope(value=“singleton”)注释)的生命周期是如何精确定义的 具体地说,是否保证在相同的ApplicationContext连续查找该bean时返回相同的bean对象实例?是的,这就是单例范围的定义:每次调用getBean()只返回一个实例。请注意,Spring中的默认作用域是非惰性singleton 另外,如果singleton被定义为lazy,并且没有其他非lazy bean引用它,那么它将在第一次显式查找期间创建 编辑:回答您的评

我想知道Spring中单例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应用程序中,父上下文不必要地创建了重复的控制器);我将在回答中解释第二个原因。