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(多線程, 生成多個實例)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM