Spring 中 Bean 的作用域有哪些?

68 阅读2分钟

@[toc]

Spring 中 Bean 的作用域有哪些?

回答

  • Spring的Bean的作用域,描述的是 这个Bean在哪个范围内可以被使用。不同的作用域决定了 Bean 的创建管理和销毁的方式。
  • 常见的作用域有五种
    1. Singleton
    2. Prototype
    3. Request
    4. Session
    5. Application
  • 我们可以在定义 Bean 的时候,通过 @Scope 注解来指定他的作用域

image-20241211183646212

1. 单例 (Singleton) ***一般都用这个
  • 默认作用域
  • 每个 Spring IoC 容器,只创建一个 Bean 实例。
  • 适用于全局共享的状态
2. 原型 (Prototype) **有时会用
  • 每次请求,都会创建一个新的 Bean 实例。
  • 适用于所有状态都是非共享的情况。
3. 请求 (Request)
  • 仅在 Web 应用程序中有效。
  • 每个 HTTP 请求,都会创建一个新的 Bean 实例。
  • 用于请求级别的数据存储和处理
4. 会话 (Session)
  • 仅在 Web 应用程序中有效
  • 每个 HTTP 会话,都会创建一个新的 Bean 实例。
  • 适用于会话级别的数据存储和处理
5. 应用 (Application)
  • 仅在 Web 应用程序中有效
  • 在 ServletContext 的生命周期内,只创建一个 Bean 实例
  • 适用于全应用程序级别的共享数据。
6. Websocket
  • 仅在 Web 应用程序中有效
  • 在 Websocket 的生命周期内,只创建一个 Bean 实例
  • 适用于websocket级别的共享数据
7、singleton vs prototype
  • 下面是 Spring 官方给出的两个对比图

img

img

扩展

1. 作用域与循环依赖
  • Spring 在解决循环依赖时,只解决了单例作用域的。
2. 自定义作用域
  • 除了 Spring 官方提供的这些作用域以外,我们还可以自定义我们自己的作用域。要自定义一个 Spring 的作用域,需要实现org.springframework.beans.factory.config.Scope 接口。
  • Scope 接口

image-20241211195129195

  • 实现 Scope 接口

image-20241211195205418

  • 注册这个自定义的作用域。可以通过 org.springframework.beans.factory.config.ConfigurableBeanFactory#registerScope 方法实现。

image-20241211195512217

  • 使用这个自定义作用域

image-20241211195603653