spring 單例問題。

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



 <bean id="meetAction"class="com.web.actions.MeetsAction"
  scope="prototype">
  <propertyname="meetsService" ref="meetsService" />
 </bean>

 

<!--
 scope="prototype"沒寫的問題,項目中對一個表的增刪該操作是用一個action,這個action有add,update,delete,save這些方法,
 添加和修改是共用一個頁面,當頁面得到id時代表進行的修改操作,反之是添加操作。因爲在配置spring的bean是忘了寫scope="prototype"
 所以每次添加時都顯示最後一次訪問過的記錄,scope="prototype"會在該類型的對象被請求
 時創建一個新的action對象。如果沒有配置scope=prototype則添加的時候不會新建一個action,他任然會保留上次訪問的過記錄的信息
webwork的Action不是線程安全的,要求在多線程環境下必須是一個線程對應一個獨立的實例,不能使用singleton。所以,我們在Spring配置WebworkAction Bean時,需要加上屬性scope=”prototype”或singleton=”false”。
singleton模式指的是對某個對象的完全共享,包括代碼空間和數據空間,說白了,如果一個類是singleton的,假如這個類有成員變量,那麼這個成員變量的值是各個線程共享的(有點類似於static的樣子了),當線程A往給變量賦了一個值以後,線程B就能讀出這個值。因此,對於前臺Action,肯定不能使用singleton的模式,必須是一個線程請求對應一個獨立的實例。推而廣之,只要是帶數據成員變量的類,爲了防止多個線程混用數據,就不能使用singleton。對於我們用到的Service、Dao,之所以用了singleton,就是因爲他們沒有用到數據成員變量,如果誰的Service需要數據成員變量,請設置singleton=false。




默認情況下,從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作用域!

引用:http://wdlisoft.javaeye.com/blog/479049

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   並非沒有狀態,如果它有自己的屬性(變量),那麼這些變量就會受到所有調用它的用戶的影響,這是在實際應用中必須注意的


發佈了39 篇原創文章 · 獲贊 4 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章