## 第八章:Spring Bean 作用域
| 作用域 | 说明 |
| ------------- | ---------------------------------------------------------- |
| **singleton** | 默认 Spring Bean 作用域,一个 BeanFactory 有且仅有一个实例 |
| **prototype** | 原型作用域,每次依赖查找和依赖注入生成新 Bean 对象 |
| request | 将 Spring Bean 存储在 ServletRequest 上下文中 |
| session | 将 Spring Bean 存储在 HttpSession 中 |
| application | 将 Spring Bean 存储在 ServletContext 中 |
**注意事项**:
- Spring 容器没有办法管理 prototype Bean 的完整生命周期,也没有办法记录示例的存
在。销毁回调方法将不会执行,可以利用 BeanPostProcessor 进行清扫工作。
- **无论是 Singleton 还是 Prototype Bean 均会执行初始化方法回调,不过仅 Singleton Bean 会执行销毁方法回调**
`@Scope` 注解定义原型 Bean :
```java
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public static User prototypeUser() {
return createUser();
}
```
### "request" Bean 作用域
- XML - ``
- Java 注解 - `@RequestScope` 或 `@Scope(WebApplicationContext.SCOPE_REQUEST)`
每次使用的 CGLIB 代理对象是同一个,但是被代理的对象每次都会重新生成。
使用 IDEA 进行远程调试:
- 在 Edit Configurations 中新增一个 Remote ,使用命令启动 jar 时,在启动命令中增加 Remote 里的内容,启动 jar 以及 Remote,打断点进行调试。
实现 API
- `@RequestScope`
- `RequestScope`
### "session" Bean 作用域
配置
- XML - ``
- Java 注解 - `@RequestScope` 或 `@Scope(WebApplicationContext.SCOPE_REQUEST)`
实现 API
- `@SessionScope`
- `SessionScope`
### "application" Bean 作用域
配置
- XML - ``
- Java 注解 - `@ApplicationScope` 或 `@Scope(WebApplicationContext.SCOPE_APPLICATION)`
实现 API
- `@ApplicationScope`
- `ServletContextScope`
实现方式与 request 和 session 不同,这里直接将 Bean 放入 `ServletContext` 中
### 自定义 Bean 作用域
实现 Scope
- `org.springframework.beans.factory.config.Scope`
注册 Scope
- API
`org.springframework.beans.factory.config.ConfigurableBeanFactory#registerScope`
- 配置
```xml
```
# 面试题
1、spring内建的bean作用域有几种?
![image-20221013214938297](assets/image-20221013214938297.png)
2、singleton bean 是否在一个应用中唯一的?
![image-20221013215027472](assets/image-20221013215027472.png)
3、application bean是否被其他方案代替?
![image-20221013215117772](assets/image-20221013215117772.png)