在配置文件中定义Bean时,用户不但可以配置Bean的属性以及相互的依赖关系,还可以定义Bean的作用域。作用域将对Bean的生命周期和创建方式产生影响,下面将列出Spring支持的所有作用域类型:
类别 | 说明 |
---|---|
singleton | 在Spring IoC容器中仅存在一个Spring实例,Bean以单实例的方式存在 |
prototype | 每次从容器中调用Bean时,都返回一个新的实例 |
request | 每次HTTP请求都会创建一个新的Bean。该作用域仅适用于WebApplicationContext环境 |
session | 同一个HTTP Session共享一个Bean,不同HTTP Session使用不同的Bean。该作用域仅适用于WebApplicationContext环境 |
globalSession | 同一个全局Session共享一个Bean,一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext环境 |
我们下面主要介绍singleton作用域与prototype作用域。
1.singleton作用域
singleton的Bean在同一Spring IoC容器中只有一个实例,请看下面的例子:
<bean id="car" class="com.baobaotao.scope.Car" scope="singleton"/>
<bean id="boss1" class="com.baobaotao.scope.Boss"p:car-ref="car"/>
<bean id="boss2" class="com.baobaotao.scope.Boss"p:car-ref="car"/>
<bean id="boss3" class="com.baobaotao.scope.Boss"p:car-ref="car"/>
不但在配置文件中通过对象引用配置注入的car引用相同的car Bean,任何通过容器的getBean(“car”)方法返回的实例也指向同一个Bean。
在默认情况下,Spring的ApplicationContext容器在启动时,自动实例化所有singleton的Bean并缓存于容器之中。虽然启动时会多花费一下时间,但是带来两个好处:
首先对Bean提前的实例化操作会及早发现一些潜在的配置问题;其次Bean以缓存的方式保存,当运行期使用到该Bean时就无需再实例化了,加快了运行的效率。
2.prototype作用域
<bean id="car" class="com.baobaotao.scope.Car" scope="prototype"/>
<bean id="boss1" class="com.baobaotao.scope.Boss"p:car-ref="car"/>
<bean id="boss2" class="com.baobaotao.scope.Boss"p:car-ref="car"/>
<bean id="boss3" class="com.baobaotao.scope.Boss"p:car-ref="car"/>
通过上面的配置,boss1、boss2、boss3所引用的都是一个新的car实例,每次通过容器的getBean(“car”)方法返回的也是一个新的Car实例。
在默认的情况下,Spring容器在启动时不实例化prototype的Bean。此外,Spring容器将prototype的Bean交给调用者后,就不再管理它的生命周期了。