singleton做用域:当把一个Bean定义设置为singleton做用域是,Spring IoC容器中只会存在一个共享的Bean实例,而且全部对Bean的
请求,只要id与该Bean定义相匹配,则只会返回该Bean的同一实例。值得强调的是singleton做用域是Spring中的缺省做用域。
prototype做用域:prototype做用域的Bean会致使在每次对该Bean请求(将其注入到另外一个Bean中,或者以程序的方式调用容器的getBean
()方法)时都会建立一个新的Bean实例。根据经验,对有状态的Bean应使用prototype做用域,而对无状态的Bean则应该使用singleton做用
域。
对于具备prototype做用域的Bean,有一点很重要,即Spring不能对该Bean的整个生命周期负责。具备prototype做用域的Bean建立后交由调
用者负责销毁对象回收资源。
简单的说:
singleton 只有一个实例,也便是单例模式。
prototype访问一次建立一个实例,至关于new。
应用场合:
1.须要回收重要资源(数据库链接等)的事宜配置为singleton,若是配置为prototype须要应用确保资源正常回收。
2.有状态的Bean配置成singleton会引起未知问题,能够考虑配置为prototype。
默 认状况下,从bean工厂所取得的实例为Singleton(bean的singleton属性) Singleton: spring容器只存在一个共享的bean实例,默认的配置。 Prototype: 每次对bean的请求都会建立一个新的bean实例。两者选择的原则:有状态的bean都使用Prototype做用域,而对无状态的bean则应该使用 singleton做用域。在Spring2.0中除了之前的Singleton和Prototype外又加入了三个新的web做用域,分别为 request、session和 global session。若是你但愿容器里的某个bean拥有其中某种新的web做用域,除了在bean级上配置相应的scope属性,还必须在容器级作一个额外 的初始化配置。即在web应用的web.xml中增长这么一个 ContextListener:org.springframework.web.context.request.RequestContextListener 以上是针对Servlet 2.4之后的版本。好比Request做用域!web
singleton 是单态模式的 ,有ioc容器管理 ,固然不是线程安全的啦 ,不过所谓的线程安全也是相对的若是你的类是没有状态的, 那用singleton 的性能要高一些 ,由于只有一个实例。若是你的类是有状态的 ,那就必须显示的设置为prototype了在ssh2 项目中,struts2的action交由spring管理的时候,spring默认是singleton的,而struts2的action显然是有状 态的,因此必须显示设置为scope="prototype",prototype为原型模式,每次action请求过来都会建立一个action可是对 那些Dao的实现类推介scope="singleton" ,由于这些类没有状态,用singleton只需维护一个实例,显然性能高一些spring
spring Bean的做用域:数据库
scope=singleton(默认,单例,生成一个实例) 不是线程安全,性能高
安全
scope=prototype(多线程, 生成多个实例)session