📜  Java Spring 中的单例和原型 Bean 范围(1)

📅  最后修改于: 2023-12-03 15:01:32.199000             🧑  作者: Mango

Java Spring 中的单例和原型 Bean 范围

在 Java Spring 框架中,Bean 可以被配置为单例(Singleton)或原型(Prototype)范围。这个范围决定了在容器中创建的 Bean 的实例化和管理方式。本文将介绍这两种范围的概念和使用方法。

单例范围(Singleton)

单例范围是默认的 Bean 范围,也是最常用的范围。在单例范围下,每个 Bean 定义只会有一个实例存在于整个应用程序的生命周期中。无论在容器中多少次请求相同的 Bean,都会返回同一个实例。

@Configuration
public class AppConfig {
    
    @Bean
    public MySingletonBean mySingletonBean() {
        return new MySingletonBean();
    }
}

在上面的配置中,MySingletonBean 被声明为一个单例 Bean。当其他组件依赖注入或使用 mySingletonBean 时,都将得到同一个实例。

原型范围(Prototype)

原型范围指定每次从容器中获取 Bean 时都会创建一个新的实例。即使多次请求相同的 Bean,也会返回不同的实例。

@Configuration
public class AppConfig {
    
    @Bean
    @Scope("prototype")
    public MyPrototypeBean myPrototypeBean() {
        return new MyPrototypeBean();
    }
}

在上述配置中,MyPrototypeBean 被声明为原型 Bean。每次使用 myPrototypeBean 时,都会创建一个新的实例。

区别和选择

单例和原型范围的主要区别在于实例化和管理方式。单例范围适用于需要共享状态的组件,而原型范围适用于每次使用都需要一个新实例的组件。

决定选择哪种范围时,需要考虑以下因素:

  • 线程安全性:单例范围的 Bean 可能存在线程安全问题,需要考虑并发访问。原型范围的 Bean 则不存在这个问题。
  • 性能:单例范围的 Bean 会在应用程序启动时创建,后续的请求都不需要再创建新的实例,因此性能较好。而原型范围的 Bean 每次请求都需要创建新的实例,性能较差。
  • 依赖注入:如果一个 Bean 对象被多个其他 Bean 依赖注入,且该对象的状态可能被修改,则应该使用原型范围,以避免共享状态引起的问题。

选择合适的范围取决于具体的应用需求,可以根据实际情况来决定使用单例范围还是原型范围。

参考文档:Spring Bean Scopes