在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为Bean。简单地讲,Bean就是由IoC容器初始化、装配及管理的对象,除此以外,Bean就与应用程序中的其余对象没有什么区别了。而Bean的定义以及Bean相互间的依赖关系将经过配置元数据来描述。web
Spring中的Bean默认都是单例的,即在Spring容器中每一个Bean对象只有一个实例。这些单例Bean在多线程程序下如何保证线程安全呢?例如对于Web应用来讲,Web容器对于每一个用户请求都建立一个单独的Sevlet线程来处理请求,引入Spring框架以后,每一个Action都是单例的,那么对于Spring托管的单例Service Bean,如何保证其安全呢?安全
做用域 | 注释 |
---|---|
singleton | 单例模式,即在Spring的IoC容器中仅存在一个Bean实例,此为默认模式。 |
prototype | 原型模式,每次经过Spring容器获取prototype定义的bean时,容器都将建立一个新的Bean实例,每一个Bean实例都有本身的属性和状态。 |
request | 在一次Http请求中,容器会返回该Bean的同一实例。而对不一样的Http请求则会产生新的Bean,并且该bean仅在当前Http Request内有效。 |
session | 在一次Http Session中,容器会返回该Bean的同一实例。而对不一样的Session请求则会建立新的实例,该bean实例仅在当前Session内有效。 |
globalSession | 在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效。 |
五种做用域中,request、session和global session三种做用域仅在基于web的应用中使用(没必要关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。session
1)当一个Bean的做用域为singleton,那么Spring IoC容器中只会存在一个共享的Bean实例,而且全部对Bean的请求,只要id与该Bean定义相匹配,则只会返回Bean的同一实例。Singleton是单例类型,就是在建立起容器时就同时自动建立了一个Bean的对象,无论你是否使用,它都存在了,每次获取到的对象都是同一个对象。注意,singleton做用域是Spring中的缺省做用域。多线程
要在XML中将Bean定义成singleton,能够这样配置:框架
<bean id="userDao" class="com.itcast.dao.impl.UserDaoImpl" scope="singleton"></bean> 或者 <bean id="userDao" class="com.itcast.dao.impl.UserDaoImpl"></bean>
2)当一个Bean的做用域为prototype,表示一个Bean定义对应多个对象实例。prototype做用域的bean会致使在每次对该bean请求(将其注入到另外一个bean中,或者以程序的方式调用容器的getBean()方法)时都会建立一个新的Bean实例。prototype是原型类型,它在咱们建立容器的时候并无实例化,而是当咱们获取bean的时候才会去建立一个对象,并且咱们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype做用域,而对无状态的bean则应该使用singleton做用域。.net
在XML中将Bean定义成prototype,能够这样配置:prototype
<bean id="userDao" class="com.itcast.dao.impl.UserDaoImpl" scope="prototype"></bean>
3)当一个Bean的做用域为request,表示在一次HTTP请求中,一个Bean定义对应一个实例;即每一个HTTP请求都会有各自的Bean实例。该做用域仅在基于Web的Spring ApplicationContext情形下有效。线程
在XML中将Bean定义成request,能够这样配置:code
<bean id="userDao" class="com.itcast.dao.impl.UserDaoImpl" scope="request"></bean>
4)当一个Bean的做用域为session,表示在一个HTTP session中,一个Bean定义对应一个实例。该做用域仅在基于Web的Spring ApplicationContext情形下有效。对象
在XML中将Bean定义成request,能够这样配置:
<bean id="userDao" class="com.itcast.dao.impl.UserDaoImpl" scope="session"></bean>
5)当一个bean的做用域为global session,表示在一个全局的HTTP Session中,一个Bean定义对应一个实例。典型状况下,仅在使用portlet context的时候有效。该做用域仅在基于Web的Spring ApplicationContext情形下有效。
在XML中将Bean定义成request,能够这样配置:
<bean id="userDao" class="com.itcast.dao.impl.UserDaoImpl" scope="globalSession"></bean>