@[toc]
Spring 中 Bean 的作用域有哪些?
回答
- Spring的Bean的作用域,描述的是 这个Bean在哪个范围内可以被使用。不同的作用域决定了 Bean 的创建管理和销毁的方式。
- 常见的作用域有五种
- Singleton
- Prototype
- Request
- Session
- Application
- 我们可以在定义 Bean 的时候,通过
@Scope注解来指定他的作用域
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 官方给出的两个对比图
扩展
1. 作用域与循环依赖
- Spring 在解决循环依赖时,只解决了单例作用域的。
2. 自定义作用域
- 除了 Spring 官方提供的这些作用域以外,我们还可以自定义我们自己的作用域。要自定义一个 Spring 的作用域,需要实现
org.springframework.beans.factory.config.Scope接口。 Scope接口
- 实现 Scope 接口
- 注册这个自定义的作用域。可以通过
org.springframework.beans.factory.config.ConfigurableBeanFactory#registerScope方法实现。
- 使用这个自定义作用域