zoukankan      html  css  js  c++  java
  • singleton和prototype的区别

    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作用域!

    singleton 是单态模式的 ,有ioc容器管理 ,当然不是线程安全的啦 ,不过所谓的线程安全也是相对的如果你的类是没有状态的, 那用singleton 的性能要高一些 ,因为只有一个实例。如果你的类是有状态的 ,那就必须显示的设置为prototype了在ssh2 项目中,struts2的action交由spring管理的时候,spring默认是singleton的,而struts2的action显然是有状 态的,所以必须显示设置为scope="prototype",prototype为原型模式,每次action请求过来都会创建一个action但是对 那些Dao的实现类推介scope="singleton" ,因为这些类没有状态,用singleton只需维护一个实例,显然性能高一些

    spring Bean的作用域:

    scope=singleton(默认,单例,生成一个实例) 不是线程安全,性能高

    scope=prototype(多线程, 生成多个实例)

  • 相关阅读:
    三级指针
    外挂指针
    内存四区(1)(转载)
    内存四区(3)(转载)
    劫持(1)
    过滤劫持和函数回调(2)
    劫持程序(3)
    dll注入实现MFC程序劫持(4)
    virtual hust 2013.6.20 数论基础题目 I
    virtual hust 2013.6.20 数论基础题目 D
  • 原文地址:https://www.cnblogs.com/jpfss/p/9453826.html
Copyright © 2011-2022 走看看