春天单身豆生命周期

时间:2011-07-13 16:00:25

标签: spring

我想知道如何精确定义Spring中单例bean(用@Scope(value="singleton")注释)的生命周期。

具体来说,是否保证在该bean的相同ApplicationContext个连续查找中返回相同的bean对象实例?

1 个答案:

答案 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内容。

相关问题