struts2的控制類action是多例的spring
springMVC的控制器類Controller是單例的併發
struts2和springMVC區別在於對數據的處理不一樣,struts2以屬性形式綁定數據,所以必須多例纔不會數據混亂。spa
springMVC是經過方法傳遞參數,綁定數據,每次調用方法傳遞的參數都是獨立的,所以單列便可.prototype
1. 什麼是單例多例:orm
所謂單例就是全部的請求都用一個對象來處理,好比咱們經常使用的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一般很難重現和查找;對象