声明容器中的对象的生命周期。当对象在Spring容器中组装生成以后,由scope负责该对象在容器中的读取和销毁操做。html
Spring Framework支持五种做用域。 最初提供了两种类型: singleton和prototype。在2.0后引入了三种只能在web应用的ApplicationContext中使用的类型: request, session, global session。理论上,Spring 2.0支持无数多种类型bean,用户可根据本身的须要,增长新的bean类型。java
默认是singleton。web
在Spring IOC容器中,只存在一个共享的bean实例。这个单一实例被存储在单例缓存(Singleton Cache)中,对于全部针对该bean的后续请求和引用,只要ID和定义相匹配,就返回同一实例。spring
区分:设计模式
单例设计模式表示一个ClassLoader中只有一个class存在,而这里的singleton做用域表示一个容器中只存在一个bean。缓存
对该类对象的每个请求,都会产生一个新的BEAN实例,至关于一个new操做。安全
特殊的一点是, Spring容器没法对prototype bean的整个生命周期负责,容器在初始化、配置、装配完一个prototype实例后,将它交给调用者,就再也不管它了,任何配置好的析构生命周期回调方法都不会被调用。清除prototype对象并释放持有的资源,都由调用者负责。session
对于其余做用域,容器会调用全部对象的初始化生命周期回调方法。ssh
针对每一次HTTP请求,都会产生一个新的BEAN,同时该BEAN仅在当前HTTP request内有效。性能
注意!!request、session、global session使用的时候首先要在初始化web的web.xml中作以下配置:
若是你使用的是Servlet 2.4及以上的web容器,那么你仅须要在web应用的XML声明文件web.xml中增长下述ContextListener便可。若是是Servlet2.4之前的web容器,那么你要使用一个javax.servlet.Filter的实现,这里略。
session做用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效。
相似于标准的HTTP Session做用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被全部构成某个 portlet web应用的各类不一样的portlet所共享。在global session做用域中定义的bean被限定于全局portlet Session的生命周期范围内。若是你在web中使用global session做用域来标识bean,那么web会自动当成session类型来使用。
默认状况下,从bean工厂所取得的实例为Singleton。单态模式的bean由IOC容器管理,非线程安全。
有状态的bean都使用Prototype做用域,而对无状态的bean则应该使用singleton做用域。
若是你但愿容器里的某个bean拥有其中某种新的web做用域,除了在bean级上配置相应的scope属性,还必须在容器级作一个额外的初始化配置。即在web应用的web.xml中增长一个ContextListener。
在ssh2 项目中 , struts2的action交由spring管理的时候 ,spring默认是singleton的 ,而struts2的action显然是有状态的 ,因此必须显示设置为 scope=“prototype”。prototype为原型模式 , 每次action请求过来都会建立一个action。
对那些Dao的实现类推荐scope=“singleton” ,由于这些类没有状态,用singleton只需维护一个实例,显然性能高一些。
<Spring 解密>