參考如下內容,講的很好,可以配置controller為單例模式,每次都新建一個:SpringMVC和Struts2中是併發訪問否會存線上程安全問題。對於使用過SpringMVC和Struts2的人來說,大家都知道SpringMVC是基於方法的攔截,而Struts2是基於類的攔截。對於Struts2來說,因為每次處理一個請求,struts就會例項化一個物件;這樣就不會有執行緒安全的問題了;而Spring的controller預設是Singleton的,這意味著每一個request過來,系統都會用原有的instance去處理,這樣導致兩個結果:一是我們不用每次建立Controller,二是減少了物件建立和垃圾收集的時間;由於只有一個Controller的instance,當多個執行緒呼叫它的時候,它裡面的instance變數就不是執行緒安全的了,會發生竄資料的問題。當然大多數情況下,我們根本不需要考慮執行緒安全的問題,比如dao,service等,除非在bean中聲明瞭例項變數。因此,我們在使用spring mvc 的contrller時,應避免在controller中定義例項變數。 如:[java] view plain copy print?public class Controller extends AbstractCommandController { protected Company company; protected ModelAndView handle(HttpServletRequest request,HttpServletResponse response,Object command,BindException errors) throws Exception { company = ................; } } 解決方案:有幾種解決方法:1、在Controller中使用ThreadLocal變數2、在spring配置檔案Controller中宣告 scope="prototype",每次都建立新的controller所在在使用spring開發web 時要注意,預設Controller、Dao、Service都是單例的。
參考如下內容,講的很好,可以配置controller為單例模式,每次都新建一個:SpringMVC和Struts2中是併發訪問否會存線上程安全問題。對於使用過SpringMVC和Struts2的人來說,大家都知道SpringMVC是基於方法的攔截,而Struts2是基於類的攔截。對於Struts2來說,因為每次處理一個請求,struts就會例項化一個物件;這樣就不會有執行緒安全的問題了;而Spring的controller預設是Singleton的,這意味著每一個request過來,系統都會用原有的instance去處理,這樣導致兩個結果:一是我們不用每次建立Controller,二是減少了物件建立和垃圾收集的時間;由於只有一個Controller的instance,當多個執行緒呼叫它的時候,它裡面的instance變數就不是執行緒安全的了,會發生竄資料的問題。當然大多數情況下,我們根本不需要考慮執行緒安全的問題,比如dao,service等,除非在bean中聲明瞭例項變數。因此,我們在使用spring mvc 的contrller時,應避免在controller中定義例項變數。 如:[java] view plain copy print?public class Controller extends AbstractCommandController { protected Company company; protected ModelAndView handle(HttpServletRequest request,HttpServletResponse response,Object command,BindException errors) throws Exception { company = ................; } } 解決方案:有幾種解決方法:1、在Controller中使用ThreadLocal變數2、在spring配置檔案Controller中宣告 scope="prototype",每次都建立新的controller所在在使用spring開發web 時要注意,預設Controller、Dao、Service都是單例的。