Spring Bean作用域
我们可以在 <bean> 元素中添加 scope 属性来配置 Spring Bean 的作用范围。例如,如果每次获取 Bean 时,都需要一个新的 Bean 实例,那么应该将 Bean 的 scope 属性定义为 prototype,如果 Spring 需要每次都返回一个相同的 Bean 实例,则应将 Bean 的 scope 属性定义为 singleton。
Spring 5 共提供了 6 种 scope 作用域,如下表。
作用范围 | 描述 |
|---|---|
singleton | 默认值,单例模式,表示在 Spring 容器中只有一个 Bean 实例 |
prototype | 原型模式,表示每次通过 Spring 容器获取 Bean 时,容器都会创建一个新的 Bean 实例。 |
request | 每次 HTTP 请求,容器都会创建一个 Bean 实例。该作用域只在当前 HTTP Request 内有效。 |
session | 同一个 HTTP Session 共享一个 Bean 实例,不同的 Session 使用不同的 Bean 实例。该作用域仅在当前 HTTP Session 内有效。 |
application | 同一个 Web 应用共享一个 Bean 实例,该作用域在当前 ServletContext 内有效。 与 singleton 类似,但 singleton 表示每个 IoC 容器中仅有一个 Bean 实例,而一个 Web 应用中可能会存在多个 IoC 容器,但一个 Web 应用只会有一个 ServletContext,也可以说 application 才是 Web 应用中货真价实的单例模式。 |
websocket | websocket 的作用域是 WebSocket ,即在整个 WebSocket 中有效。 |
注意:在以上 6 种 Bean 作用域中,除了 singleton 和 prototype 可以直接在常规的 Spring IoC 容器(例如 ClassPathXmlApplicationContext)中使用外,剩下的都只能在基于 Web 的 ApplicationContext 实现(例如 XmlWebApplicationContext)中才能使用,否则就会抛出一个 IllegalStateException 的异常。
本节,我们就只对 singleton 和 prototype 这两种 Bean 作用域进行详细的讲解,于其他 Bean 作用域,我们会在后续的教程中陆续进行介绍。
singleton
singleton 是 Spring 容器默认的作用域。当 Bean 的作用域为 singleton 时,Spring IoC 容器中只会存在一个共享的 Bean 实例。这个 Bean 实例将存储在高速缓存中,所有对于这个 Bean 的请求和引用,只要 id 与这个 Bean 定义相匹配,都会返回这个缓存中的对象实例。如果一个 Bean 定义的作用域为 singleton ,那么这个 Bean 就被称为 singleton bean。在 Spring IoC 容器中,singleton bean 是 Bean 的默认创建方式,可以更好地重用对象,节省重复创建对象的开销。
在 Spring 配置文件中,可以使用 <bean> 元素的 scope 属性,将 Bean 的作用域定义成 singleton,其配置方式如下所示:
<bean id="..." class="..." scope="singleton"/>
示例 1
下面我们就通过一个简单的实例,对 Bean 的 singleton 作用域进行演示。1. 参考《个 Spring 程序》,新建一个名为 my-spring-scope-demo 的 Java 项目。
2. 在 my-spring-scope-demo 中,新建一个名为 net.biancheng.c 的包,并在这个包下创建一个名为 SingletonBean 的类,代码如下。
package net.biancheng.c;
public class SingletonBean {
private String str;
public void setStr(String str) {
this.str = str;
}
}
3. 在 src 目录下创建 Spring 配置文件 Beans.xml,配置如下。
<beans xmlns="http://www.springframework网站站点" rel="nofollow" />
package net.biancheng.c;
import org.apac站站点" rel="nofollow" />
net.biancheng.c.SingletonBean@65e2dbf3
net.biancheng.c.SingletonBean@65e2dbf3
从控制台的输出可以看出,两次获得的 Bean 实例的地址完全一样,这说明 IoC 容器只创建了一个 singletonBean 实例。由于 singleton 是 Spring IoC 容器的默认作用域,因此即使省略 scope 属性,控制台的输出结果也一样的。
prototype
如果一个 Bean 定义的作用域为 prototype,那么这个 Bean 就被称为 prototype bean。对于 prototype bean 来说,Spring 容器会在每次请求该 Bean 时,都创建一个新的 Bean 实例。从某种意义上说,Spring IoC 容器对于 prototype bean 的作用就相当于 Java 的 new 操作符。它只负责 Bean 的创建,于后续的生周期管理则都是由客户端代码完成的,详情请参看《Spring Bean 生周期》。
在 Spring 配置文件中,可以使用 <bean> 元素的 scope 属性将 Bean 的作用域定义成 prototype,其配置方式如下所示:
<bean id="..." class="..." scope="prototype"/>
示例 2
下面我们就通过一个简单的实例,对 Bean 的 prototype 作用域进行演示。1. 在 net.biancheng.c 包中,创建一个名为 PrototypeBean 的类,代码如下。
package net.biancheng.c;
public class PrototypeBean {
private String str;
public void setStr(String str) {
this.str = str;
}
}
2. 在 Beans.xml 中,添加 PrototypeBean 的 Bean 的定义,配置如下。
<beans xmlns="http://www.springframework网站站点" rel="nofollow" />
package net.biancheng.c;
import org.apac站站点" rel="nofollow" />
net.biancheng.c.PrototypeBean@61f8bee4
net.biancheng.c.PrototypeBean@7b49cea0
从运行结果可以看出,两次输出的内容并不相同,这说明在 prototype 作用域下,Spring 容器创建了两个不同的 prototypeBean 实例。
- 随机文章
- 直播 中国 马尔代夫战争(中国军队出动 马尔代夫战争实时报道)
- 武汉 马尔代夫(武汉市民欢度疫情后首个国庆 黄金周出境游首选马尔代夫)
- 中国 马尔代夫 比分(马尔代夫与中国足球队比分揭晓)
- 卡尔马尔代夫视频(探索卡马尔代夫!体验绝美海岛风光!)
- 徐州马尔代夫美景(徐州的“马尔代夫”美景,让人惊叹!)
- 国足替补马尔代夫(国足替补赢下关键一战,战胜马尔代夫)
- 出国劳务马尔代夫(马尔代夫出国劳务市场需求大,机会多)
- 成都 马尔代夫(成都公园内惊现马尔代夫风光)
- 虎鲨 马尔代夫(马尔代夫现现巨大虎鲨)
- 安丘马尔代夫名单(安丘公布违规出入马尔代夫旅游黑名单)
- 散文 马尔代夫(美丽的马尔代夫:天堂之岛)
- 广东马尔代夫岛屿(广东打造马尔代夫式热带海岛旅游胜地)
- 武穴马尔代夫在哪(武穴有马尔代夫?探秘这个惊喜之地!)
- 水飞机看马尔代夫(马尔代夫岛屿航线最佳选择:水上飞机)
- 海边马尔代夫文案(热带季节,马尔代夫之旅等你来体验!)
- 国家 马尔代夫(马尔代夫:美丽海滩与热带岛屿的天堂)
- 马尔代夫韩文翻译(马尔代夫韩语翻译争议,当地政府回应 内)
- 莱州马尔代夫景区(莱州设施完善,马尔代夫景区美景如画)
- 翡翠马尔代夫玫瑰(马尔代夫玫瑰:翡翠开辟全新度假天堂)
- 美国马尔代夫风景(探索美丽马尔代夫:美丽景色尽收眼底)
- 美丽多姿马尔代夫(探秘印度洋明珠:缤纷多彩的马尔代夫)
- 重庆马尔代夫烤肉(重庆市民在“马尔代夫”尝鲜烤肉体验)
- 南非的去马尔代夫(南非旅游者纷纷改去其他海滨度假胜地)
- 济宁旅游马尔代夫(济宁旅游新选择:畅游神秘的马尔代夫)
- 河北的马尔代夫在(河北省拥有别具特色的马尔代夫风景区)
- 马尔代夫丛林大海(探索马尔代夫的自然奇观:丛林和大海)
- 潜水教练马尔代夫(马尔代夫潜水教练:在这片天堂中畅游)
- 菲律宾飞马尔代夫(菲律宾缤纷与浪漫,如同飞往马尔代夫)
- 国足马尔代夫炎热(国足全力备战烈日炎炎的马尔代夫赛事)
- 马尔代夫变垃圾岛(马尔代夫成功将垃圾岛变成海洋保护区)
