Spring单例bean生命周期

标签 spring

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

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

最佳答案

是的,这就是singleton范围的定义:每次调用getBean()时仅返回一个实例。请注意,非惰性 singleton 是 Spring 中的默认作用域。

此外,如果 singleton 被定义为惰性并且没有其他非惰性 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 创建的类,以在没有任何接口(interface)的类上实现代理。为了保留 Singleton 公共(public)接口(interface),CGLIB 生成的类必须从原始类派生子类。这样,CGLIB 类就可以用在需要 Singleton 的地方(多态性)。但子类必须调用基类构造函数,因此需要两次构造函数调用。

但别担心,CGLIB 生成的类只是一个 stub ,它将所有调用重定向到“普通”bean,同时应用 AOP 内容。

关于Spring单例bean生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6681907/

相关文章:

java.sql.SQLException : Table/View 'LOCATION' already exists in Schema 'APP'

java - Spring、PagingAndSortingRepository、findOne 和 @EmbeddedId

java - Spring存储库查询两个表

java - 部署到 war 的 Spring Boot 不发送谷歌电子邮件

spring - Spring Security不会发布到提供的登录处理URL

spring - 如何在带有tomcat的spring mvc maven应用程序中提供来自外部war文件的静态数据

java - 在身份验证之前检查用户启用状态 - Spring Security

java - SpringBoot Controller 无法解析名称为 'home' 的 View

java - 没有 commandName 的 Spring 表单

java - Spring Integration Http 休息服务