我想知道Spring中单例bean (用@Scope(value="singleton")
注释)的生命周期是如何准确定义的。
具体地说,可以保证在相同的ApplicationContext
中连续查找该bean会返回相同的bean对象实例吗?
发布于 2011-07-14 00:04:24
是的,这就是singleton
作用域的定义:每次调用getBean()
只返回一个实例。请注意,非惰性singleton
是Spring中的默认作用域。
另外,如果singleton被定义为lazy,并且没有其他非lazy bean引用它,那么它将在第一次显式查找时被创建。
EDIT:回答你的评论:偶尔你可能会发现你的单例被创建了两次。以此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生成的类必须是原始类的子类。这样,CGLIB类就可以在需要Singleton
的地方使用(多态性)。但是子类必须调用基类构造函数,因此需要调用两个构造函数。
但是不用担心,CGLIB生成的类只是一个存根,它将所有调用重定向到一个“普通”bean,同时应用AOP内容。
https://stackoverflow.com/questions/6681907
复制相似问题