Spring 系列 - Bean 的 Scope
Publish date: Oct 139, 13119
Last updated: Oct 219, 21029
Last updated: Oct 219, 21029
问
简要介绍一下 bean 的几种 Scope 吧?
答
含义
通俗来说,称为 作用域
声明容器中的对象所应该处的 限定场景 或 该对象的存活时间
容器在对象进入其 scope 前,生成并装配好对象
容器在对象不再处于这些 scope 限定后,销毁这些对象
类型
singleton
标记为 singleton 的对象,在 Spring 的 IoC 容器中只存在一个实例
所有对该对象的引用,共享同一个实例
- 从 对象实例数量 角度,在一个容器中只存在一个实例
- 从 对象存活时间 角度,从 容器启动到它第一次初始化开始,一直存活
bean 的默认 scope
<bean id="mockObject1" class="..MockBusinessObject"/>
<bean id="mockObject1" class="..MockBusinessObject" singleton="true"/>
<bean id="mockObject1" class="..MockBusinessObject" scope="singleton"/>
prototype
标记为 prototype 的对象,容器会为每一次对该对象的请求,生成一个新实例
容器完成对象实例化和装配工作,就不再引用该对象,由其自身管理生命周期
请求方不共享一个实例
<bean id="mockObject1" class="..MockBusinessObject" singleton="false"/>
<bean id="mockObject1" class="..MockBusinessObject" scope="prototype"/>
request | session | global session
前提:仅适用于 Web 应用程序,通常与 XmlWebApplicationContext 共同使用
- request
XmlWebApplicationContext 为每一个 HTTP 请求创建一个新的 RequestProcessor 供当前请求使用,当请求结束后,该对象实例的生命周期结束。
prototype 的特例,场景只能用在 Web 应用中
<bean id="requestProcessor" class="..RequestProcessor" scope="request"/>
- session
对于需要放入 session 中的信息,指定其 scope 为 session
与 request 基本相同,可能该实例的生命周期更长
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
- global session
只能应用在基于 portlet 的 Web 应用程序中
如果是在基于 servlet 的 Web 应用中,与 session 相同
<bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/>