默认情况下,Spring Bean是单例还是多例?

参考回答

默认情况下,Spring中的Bean是单例(Singleton)作用域的。也就是说,Spring容器会为每个Bean类型创建一个唯一的实例,并且在容器的整个生命周期内,所有对该Bean的请求都会返回相同的实例。

详细讲解与拓展

1. 单例作用域(Singleton Scope)

  • 定义:Spring容器中默认的作用域是单例,意味着每个Bean在容器中只有一个实例。每次请求这个Bean时,Spring会返回相同的实例。
  • 适用场景:适用于那些在整个应用中只需要一个实例的Bean,例如服务类、工具类等。
  • 生命周期:Spring容器在启动时会创建单例Bean的实例,并且在容器的整个生命周期中,该Bean实例都会保持不变,直到容器销毁。

示例

@Component
public class MyService {
    // 这是一个单例Bean
}
Java

XML配置

<bean id="myService" class="com.example.MyService" scope="singleton"/>
XML

在这个例子中,MyService Bean的作用域是单例的,Spring容器只会创建一个MyService实例,所有使用该Bean的地方都将使用同一个实例。

2. 多例作用域(Prototype Scope)

  • 定义:如果Bean的作用域被设置为多例(Prototype),则每次从容器中请求该Bean时,都会创建一个新的实例。
  • 适用场景:适用于每次请求都需要不同实例的Bean,例如临时状态的对象、计算过程中的临时对象等。
  • 生命周期:每次请求时都会创建一个新的Bean实例。Spring容器在请求Bean时才会创建该Bean,而不会在容器启动时创建。

示例

@Component
@Scope("prototype")
public class MyPrototypeService {
    // 这是一个多例Bean
}
Java

XML配置

<bean id="myPrototypeService" class="com.example.MyPrototypeService" scope="prototype"/>
XML

在这个例子中,MyPrototypeService Bean的作用域是多例的,每次请求myPrototypeService时,Spring容器都会创建一个新的实例。

总结

  • 默认情况下,Spring的Bean是单例作用域,容器只会为每个Bean类型创建一个实例,并且在容器生命周期内共享这个实例。
  • 通过使用@Scope("prototype")注解或在XML配置中指定scope="prototype",可以将Bean的作用域改为多例,从而每次请求都会创建新的实例。

如果你没有显式地定义作用域,那么Spring会假定你使用的是单例作用域。

发表评论

后才能评论