struts2&springmvc單例多例

struts2的控制類action是多例的

springMVC的控制器類Controller是單例的

 

struts2springMVC區別在於對數據的處理不同,struts2以屬性形式綁定數據,因此必須多例纔不會數據混亂。

springMVC是通過方法傳遞參數,綁定數據,每次調用方法傳遞的參數都是獨立的,因此單列即可.

1. 什麼是單例多例:

所謂單例就是所有的請求都用一個對象來處理,比如我們常用的service和dao層的對象通常都是單例的,而多例則指每個請求用一個新的對象來處理,比如action; 
2. 如何產生單例多例:
    在通用的SSH中,單例在spring中是默認的,如果要產生多例,則在配置文件的bean中添加scope="prototype"; 
3. 爲什麼用單例多例:
    之所以用單例,是因爲沒必要每個請求都新建一個對象,這樣子既浪費CPU又浪費內存;
   之所以用多例,是爲了防止併發問題;即一個請求改變了對象的狀態,此時對象又處理另一個請求,而之前請求對對象狀態的改變導致了對象對另一個請求做了錯誤的處理;
    用單例和多例的標準只有一個:
    當對象含有可改變的狀態時(更精確的說就是在實際應用中該狀態會改變),則多例,否則單例;
4. 何時用單例?何時用多例?
    對於struts2來說,action必須用多例,因爲action本身含有請求參數的值,即可改變的狀態;
  而對於STRUTS1來說,action則可用單例,因爲請求參數的值是放在actionForm中,而非action中的;
   另外要說一下,並不是說service或dao一定是單例,標準同第3點所講的,就曾見過有的service中也包含了可改變的狀態,同時執行方法也依賴該狀態,但一樣用的單例,這樣就會出現隱藏的BUG,而併發的BUG通常很難重現和查找;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章