Spring MVC的controller是singleton的(非線程安全的)

一、Spring MVC中Controller、Service、Dao默認都是單實例的

二、Spring MVC的controller是singleton的(非線程安全的),和struts2的不一樣,對於使用過SpringMVC

和Struts2的人來講,你們都知道SpringMVC是基於方法的攔截,而Struts2是基於類的攔截。spring

對於Struts2來講,由於每次處理一個請求,struts就會實例化一個對象;這樣就不會有線程安全的問題了(如安全

果變量不是靜態的);prototype

對於SpringMVC來講,默認是單實例,每一個request過來,系統都會用原有的instance去處理。當多個線程調用線程

它的時候,它裏面的instance變量就不是線程安全的了,會發生竄數據的問題。code

三、spring生成對象默認是單例的。經過scope屬性能夠更改成多例(@Scope("prototype"))。

四、單實例產生的做用:一是咱們不用每次建立Controller,二是減小了對象建立和垃圾收集的時間;

五、解決方法:

在Controller中使用ThreadLocal變量對象

// ThreadLocal類能夠去查一下,解決線程安全,保證幾個線程互不影響
	private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

最根本的解決辦法仍是儘可能不要在Controller裏面定義變量struts2

相關文章
相關標籤/搜索