1. 程式人生 > >singleton和prototype的區別

singleton和prototype的區別

http://blog.csdn.net/wenzi49312/article/details/28433851

默 認情況下,從bean工廠所取得的例項為Singleton(bean的singleton屬性) 

Singleton: Spring容器只存在一個共享的bean例項,預設的配置。 那麼Spring IoC容器中只會存在一個共享的bean實,並且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一例項。換言之,當把一個bean定義設定為singlton作用域時,Spring IoC容器只會建立該bean定義的唯一例項。這個單一例項會被儲存到單例快取(singleton cache)中,並且

所有針對該bean的後續請求和引用都將返回被快取的物件例項。

Prototype: 每次對bean的請求都會建立一個新的bean例項(將其注入到另一個bean中,或者以程式的方式呼叫容器的getBean()方法--只有getbean才會在容器中生成一個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(多執行緒, 生成多個例項)