Spring中Bean的做用范围

一、Spring中的bean对象是什么?

  在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为Bean。简单地讲,Bean就是由IoC容器初始化、装配及管理的对象,除此以外,Bean就与应用程序中的其余对象没有什么区别了。而Bean的定义以及Bean相互间的依赖关系将经过配置元数据来描述。web

二、为何Spring中bean须要不一样的做用范围?

  Spring中的Bean默认都是单例的,即在Spring容器中每一个Bean对象只有一个实例。这些单例Bean在多线程程序下如何保证线程安全呢?例如对于Web应用来讲,Web容器对于每一个用户请求都建立一个单独的Sevlet线程来处理请求,引入Spring框架以后,每一个Action都是单例的,那么对于Spring托管的单例Service Bean,如何保证其安全呢?安全

三、Spring中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>

文章引用,感谢原做者,原文参数

相关文章
相关标签/搜索