簡體   English   中英

Spring Controller單例對象

[英]Spring Controller singleton Object

我對控制器對象有些困惑。 據我所知,默認情況下控制器為單例。 Singleton如何用於Web應用程序,如下面的代碼所示,如​​果線程1執行到第9行並且empId為12,線程2從線程1獲得控制,而empId為23並完成整個方法的執行,然后再次執行線程1執行empId的值是12還是23。

而且我還注意到,僅為UserServiceDao類創建了一個對象,因此如何在spring mvc中管理線程,每個線程都有自己的實例。

1 public class ActionController {
2
3   @Autowired
4   UserServiceDao userServiceDao;
5   
    int count = 1;
6   
7   @RequestMapping("/dashboard.htm")
8       public ModelAndView dashboard(HttpServletRequest request) {
9           String empId = request.getParameter("empId");
10          UserProfile userProfile = userServiceDao.loadEmpById(empId);
            System.out.println(count);
            count++;

11      }
12  }

    Thread first output: 1;
    Thread second output : 2; 

謝謝。

在控制器中,您沒有任何實例變量來保持任何控制器方法的調用狀態。 所有變量都是永不在線程之間共享的方法(局部)變量,因此以多線程方式使用它是沒有問題的。

與使用servlet相同。

方法(局部)變量駐留在堆棧上,並且作用域僅限於方法的末尾。 此處的empId是局部變量,不在多個線程之間共享。

同樣, UserServiceDao不應包含任何實例變量以保持其方法調用的狀態。

看下面的圖片:

在此處輸入圖片說明

閱讀更多僅具有局部變量的實例方法的線程安全性

控制器及其所有依賴項通常都是無狀態的,因此並發訪問無需擔心。 尤其要使您的DAO保持無狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM