天天看點

spring 中屬性scope 的prototype(有狀态)和singleton(無狀态)

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隻需維護一個執行個體,顯然性能高一些

有狀态會話bean   :每個使用者有自己特有的一個執行個體,在使用者的生存期内,bean保持了使用者的資訊,即“有狀态”;一旦使用者滅亡(調用結束或執行個體結束),bean的生命期也告結束。即每個使用者最初都會得到一個初始的bean。 

無狀态會話bean   :bean一旦執行個體化就被加進會話池中,各個使用者都可以共用。即使使用者已經消亡,bean   的生命期也不一定結束,它可能依然存在于會話池中,供其他使用者調用。由于沒有特定的使用者,那麼也就不能保持某一使用者的狀态,是以叫無狀态bean。但無狀态會話bean   并非沒有狀态,如果它有自己的屬性(變量),那麼這些變量就會受到所有調用它的使用者的影響,這是在實際應用中必須注意的