Bean的作用域
一个 bean 对应着 Spring 对一个类的对象的管理,包括多个方面,如:这个类是单例还是多例、是否使用 AOP 实现功能增强等。
Bean 的作用域,即Spring管理 bean 对象(容器内对象时)时,管理到何种程度,这个 bean对象是全局性(单例)的,还是随用随取(多例)。
在 <bean> 标签中,使用 scope 属性指明这个bean的作用域。
<bean ... scope="..." />singleton
<bean ... scope="singleton" />如名,singleton 作用域的 bean 在容器内唯一,是单例的,每次从容器内获取的都是相同的 bean 对象。
缺省配置的情况下,bean 的作用域默认就是 singleton。
singleton 作用域的 bean 在初始化上下文时就构建完成,管理在容器内。
prototype
<bean ... scope="prototype" />prototype 译为原型。 prototype 作用域(原型作用域)的 bean 在容器内不唯一,是多例的,每次从容器内获取的都是不同的 bean 对象。
- 从容器内获取时新建 bean 实例(getBean 或注入bean),并不是在初始化上下文时新建。
自定义scope
编写
org.springframework.beans.factory.config.Scope接口的实现类在 Spring 配置文件中配置(注册 Scope)
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer"> <property name="scopes"> <map> <!--注册scope,key即为这个scope的值--> <entry key="myScope"> <!--class 是Scope接口的实现类--> <bean class="org.springframework.context.support.SimpleThreadScope"/> </entry> </map> </property> </bean>使用自定义Scope
<bean id="sb" class="com.powernode.spring6.beans.SpringBean" scope="myScope" />
SimpleThreadScope 实现类
org.springframework.context.support.SimpleThreadScope 是 Spring 内置的一个 Scope 实现类,是一个线程级别的Scope。
即每个线程获取的bean都是不一样的,线程内的bean是相同的。
- 可以直接添加到配置文件中,启用线程作用域,无需重写方法。
其他 scope
scope属性的值不⽌两个,它⼀共包括8个选项:
singleton:默认的,单例。
prototype:原型。每调⽤⼀次 getBean() ⽅法则获取⼀个新的Bean对象,或每次注⼊的时候都是新对象。
自定义的scope:很少用。
request:⼀个请求对应⼀个Bean。仅限于在WEB应用中使⽤。
session:⼀个会话对应⼀个Bean。仅限于在WEB应用中使⽤。
global session:portlet 应⽤中专⽤的。
如果在 Servlet 的 WEB应⽤中使⽤global session的话,和 session⼀个效果。
(portlet和servlet都是规范。servlet运⾏在servlet容器中,例如Tomcat。 portlet运⾏在portlet容器中。)
application:⼀个应⽤对应⼀个Bean。仅限于在WEB应⽤中使⽤。
websocket:⼀个websocket⽣命周期对应⼀个Bean。仅限于在WEB应⽤中使⽤。
