Controller 默認是單例的,一般情況下,如果用Spring MVC 的 Controller時,儘量不在 Controller中使用實例變量。否則會出現線程不安全性的情況,導致數據邏輯混亂。正因爲單例所以不是線程安全的。舉個簡單例子:
@Controller
public class ScopeTestController {
private int num = 0;
@RequestMapping("/testScope")
public void testScope() {
System.out.println(++num);
}
@RequestMapping("/testScope2")
public void testScope2() {
System.out.println(++num);
}
}
【1】首先訪問 http://localhost:8080/testScope,得到的答案是1;
【2】然後我們再訪問 http://localhost:8080/testScope2,得到的答案是 2。 此時就不是我們想要的答案,num已經被修改。所有 request都訪問同一個 Controller時,這裏的私有變量就是共用的,也就是說某個 request中如果修改了這個變量,那麼在別的請求中也可讀到這個修改的內容。
【解決辦法】:
【1】不要在 Controller 中定義成員變量;
【2】萬一必須要定義一個非靜態成員變量時候,則通過註解 @Scope(“prototype”),將其設置爲多例模式。
【3】在 Controller 中使用 ThreadLocal 變量;