![Spring+Spring MVC+MyBatis从零开始学](https://wfqqreader-1252317822.image.myqcloud.com/cover/785/26542785/b_26542785.jpg)
2.2 Bean的作用域
通过Spring容器创建一个Bean的实例时,不仅可以完成Bean的实例化,还可以为Bean指定特定的作用域。本节将主要讲解Bean的作用域相关的知识。
2.2.1 作用域的种类
Spring 4.3中为Bean的实例定义了7种作用域,如表2.2所示。其中,singleton和prototype是常用的两种,在接下来的两小节中将会对这两种作用域进行详细讲解。
表2.2 Bean的作用域
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-T25_45503.jpg?sign=1739046874-DprxdjWlOLAaGbJDNvqvqo3fnKo8rK8W-0-c333a6f7cbc464e4fb5343f60475f178)
2.2.2 singleton作用域
singleton是Spring容器默认的作用域,当Bean的作用域为singleton时,Spring容器就只会存在一个共享的Bean实例,并且所有对Bean的请求,只要id与该Bean的id属性相匹配,就会返回同一个Bean的实例。singleton作用域对于无会话状态的Bean(如Dao组件、Service组件)来说是最理想的选择。
在Spring配置文件中,Bean的作用域是通过<bean>元素的scope属性来指定的,该属性值可以设置为singleton、prototype、request、session、globalSession、application、websocket七个值,分别表示表2.2中的7种作用域。要将作用域定义成singleton,需将scope的属性值设置为singleton,其示例代码如下。
<bean id="scope" class="com.ssm.scope.Scope" scope="singleton" />
【示例2-1】下面通过一个案例来进一步演示singleton作用域。
(1)在Eclipse中创建一个名为chapter02的Web项目,在该项目的lib目录中加入Spring支持和依赖的JAR包(在第1章相关内容基础上增加spring-aop-4.3.6.RELEASE.jar依赖包,并发布到类路径下)。
(2)在chapter02项目的src目录下创建一个com.ssm.scope包,在该包中创建Scope类,该类不需要写什么方法,如文件2.1所示。
文件2.1 Scope.java
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P26_45506.jpg?sign=1739046874-tir6gCa5qdB4Xoeb0BMa4iqznExIgIn5-0-f5f5488acaec75478866a47c8a59b7be)
(3)在com.ssm.scope包中创建Spring的配置文件applicationContext.xml,并在配置文件中创建一个id为scope的Bean,通过class属性指定其对应的实现类为Scope,如文件2.2所示。
文件2.2 applicationContext.xml
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P26_45507.jpg?sign=1739046874-CDiF6U6IFfNi8jfNt2GE2nSgp4aey8UN-0-4d6c626ae9a1955d58741110993fd998)
(4)在com.ssm.scope包中创建测试类ScopeTest来测试singleton作用域,如文件2.3所示。
文件2.3 ScopeTest.java
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P26_45508.jpg?sign=1739046874-yVc9EqEwBm4vaGZMVvBnMlA7J2Lisf5F-0-5d14f377168705573a1e3cafb6d5efdc)
执行程序后,控制台的输出结果如图2.1所示。从中可以看出,两次输出的结果相同,这说明Spring容器只创建了一个Scope类的实例。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P27_3550.jpg?sign=1739046874-AEB4x2PS3nWvFTJzEMPvsBUHSKJLf1Px-0-4eb2c2841ab67c171d58795b0d81f39d)
图2.1 运行结果
注意
如果不设置scope="singleton",其输出结果也是一个实例,因为Spring容器默认的作用域就是singleton。
2.2.3 prototype作用域
对需要保持会话状态的Bean应用使用prototype作用域。在使用prototype作用域时,Spring容器会为每个对该Bean的请求都创建一个新的实例。
要将Bean定义为prototype作用域,只需在配置文件中将<bean>元素的scope属性值设置为prototype即可,其示例代码如下。
<bean id="scope" class="com.ssm.scope.Scope" scope="prototype"/>
将2.2.2小节中的配置文件更改成上述代码形式后,再次运行测试类ScopeTest,控制台的输出结果如图2.2所示。从中可以看到,两次输出的Bean实例并不相同,这说明在prototype作用域下创建了两个不同的Scope实例。
![](https://epubservercos.yuewen.com/F4B88E/15056703605213206/epubprivate/OEBPS/Images/Figure-P27_3592.jpg?sign=1739046874-0CJcQs7MwtRoRL8bsfMzMT0wr8hSuvPM-0-c4a2c42ea4252a05e758c0b40404333e)
图2.2 运行结果