bean的作用域用于确定哪种类型的bean实例应该从容器中返回给调用者。作用域主要有以下五种:
作用域 | 描述 |
---|---|
singleton | 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值。 |
prototype | 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()。 |
request | 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring WebApplicationContext环境。 |
session | 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web的Spring WebApplicationContext环境。 |
global-session | 集群环境会话范围,全局会话范围,不是集群的话它就是session |
(1)singleton 单实例
<bean id="test" class="com.lichneghao.Test" scope="singleton"/>
单例类型,在容器启动的时候自动创建bean对象,无论你是否使用。对于所有bean请求,只要id与该bean定义的相匹配,那么就会返回同一个bean对象。
容器会对这个bean负责到底,直到销毁这个bean,这一点和下面prototype作用域是有区别的
(2)prototype 多实例
<bean id="test" class="com.lichneghao.Test" scope="prototype"/>
容器启动的时候,不会自动创建bean,只有去请求bean才会创建bean,并且每次都返回一个新的bean。
所以对于有状态的bean应该使用prototype作用域。
需要注意的是:容器把这个bean给了客户端后,客户端就要对这个bean以后的生命负责了,容器就不管了,例如销毁什么的需要客户端自己去处理
(3)request
bean定义如下所示:
<bean id="test" class="com.lichneghao.Test" scope="request"/>
对于每个http请求,spring容器都会创建一个test bean实例。在请求内可以随便修改bean的状态,一旦请求结束这个bean也就会会随之销毁。
(4)session
每次会话创建一个实例
<bean id="test" class="com.lichneghao.Test" scope="session"/>