摘自:Spring Bean 的作用域(Bean Scope) - god23bin - 博客园
前言
大家好,我是 god23bin,今天我们来聊一聊 Spring 框架中的 Bean 作用域(Scope)。
什么是 Bean 的作用域?
我们在以 XML 作为配置元数据的情况下,进行 Bean 的定义,是这样的:
<bean id="vehicle" class="cn.god23bin.demo.domain.model.Vehicle">
<!-- 协作者写在这里... -->
</bean>
我们写了一个 Bean 定义(Bean Definition),就是用于创建所定义的类的实例的。
一个 Bean 定义,我们可以类比一个类的定义,你定义了一个类,你可以根据这个类创建出许多实例对象。同理,Bean 定义也是,也是可以根据这个定义创建许多实例对象的,只不过这里是 Spring 帮我们创建,而不是我们手动 new 。 这些 Bean 对象实例,我们可以理解为 Spring IoC 容器中的对象。
在写 Bean 定义的过程中,我们可以控制各种 Bean 的依赖项和相应的值,将这些依赖项和值注入到 Bean 定义所创建的对象中。同理,这个过程也可以控制 Bean 定义创建的对象的 Scope(作用域)。Bean 的作用域定义了在容器中创建的 Bean 实例的生命周期以及在应用程序中的可见性。
6 种 Bean 的作用域
Spring 支持 6 种 Bean 的作用域,其中有 4 种是在 Web 应用下才能感知到的,如下表所示:
| Scope | 说明 |
|---|---|
| singleton | (默认情况下)每个 Spring IoC 容器将单个 Bean 定义的 Scope 指定为单个对象实例。 |
| prototype | 将单个 Bean 定义的 Scope 扩大到任意数量的对象实例。 |
| request | 将单个 Bean 定义的 Scope 扩大到单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有自己的 Bean 实例,该实例是在单个 Bean 定义的基础上创建的。只在 Web 感知的 Spring ApplicationContext 的上下文中有效。 |
| session | 将单个 Bean 定义的 Scope 扩大到一个 HTTP 会话的生命周期。只在 Web 感知的 Spring ApplicationContext 的上下文中有效。 |
| application | 将单个 Bean 定义的 Scope 扩大到 ServletContext 的生命周期中。只在 Web 感知的 Spring ApplicationContext 的上下文中有效。 |
| websocket | 将单个 Bean 定义的 Scope 扩大到 WebSocket 的生命周期。只在 Web 感知的 Spring ApplicationContext 的上下文中有效。 |

最低0.47元/天 解锁文章
2309

被折叠的 条评论
为什么被折叠?



