詳解Spring中singleton?bean如何同時服務多個請求
正文
當我開始學習 Spring 時,兩個“難”的問題主要在我腦海中盤旋:
- 如何創(chuàng)建單例 bean,然后如何在不同的類中自動裝配單個 bean?
- 想象一下這種情況:
有 2 個用戶,其中一個想要登錄,另一個想要同時在我們的應用程序中創(chuàng)建報告。login 和 createReport 方法都使用范圍為單例的 userService bean。在這種情況下,這些方法是否按順序使用該單例 bean?否則 singleton bean 如何同時處理多個請求?
回答他們并不像我想的那么困難。只是需要澄清簡單但重要的要點。這就是為什么我會嘗試用基本的代碼示例來描述它們。讓我們開始:
先講一下Spring容器
因為我認為這會幫助你在腦海中更好地描述過程。
Spring 容器在其中創(chuàng)建 bean。創(chuàng)建所需的 bean 后,它會注入它們的依賴項。容器通過讀取配置元數(shù)據(jù)(XML 或 Java 注釋)來獲取指令。因此,在初始化 Spring 容器后,您的應用程序就可以使用了,如下圖所示:

當你像下面這樣定義一個 bean 定義時,你告訴容器它必須只為容器中的那個 bean 定義創(chuàng)建一個實例:
<bean id=”accountDao” class=”…” scope=”singleton”/>
此單個實例存儲在此類單例 bean 的緩存中。然后 Spring 容器將這個緩存的對象返回給具有該 bean 定義的 bean 的所有請求和引用:

如果我們想用 new() 運算符顯示上面的示例,以描述 Spring 容器在應用程序啟動時所做的簡化視圖,我們可以編寫如下代碼:
UserService userService = new UserService(); UserController userController = new UserController(); userController.userService = userService; ReportController reportController = new ReportController(); reportController.userService = userService
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping(value = "/login/{username}")
public User login(@PathVariable(value = "username") String username){
System.out.println(Thread.currentThread().getName() + " ----------- " + username + " ----------- " + new Date());
return userService.login(username);
}
}
這些線程分別與單例 bean 一起工作。如何?
稍微談談 Java 中的內存分配
在 Java 中,每個對象都是在堆中創(chuàng)建的。堆是全局共享內存。這就是為什么每個線程都可以訪問堆中的對象。
但是堆棧僅用于執(zhí)行一個線程。在那個線程中,當一個方法被調用時,一個新的塊會以 LIFO(Last-In-First-Out) 順序在堆棧中創(chuàng)建。該塊保存本地原始值和對方法中其他對象的引用。并且棧內存不能被其他線程訪問。
所以當我們創(chuàng)建單例 bean 時,它駐留在堆中。由于可以從應用程序的任何位置訪問堆,因此每個創(chuàng)建的線程都可以指向該單例 bean。這是怎么發(fā)生的?當線程請求單例bean時,它會(借助堆棧中的引用變量)引用堆中單例bean的字節(jié)碼。所以多個線程可以同時引用單例bean。編譯器將指向相同的字節(jié)碼并簡單地執(zhí)行它并將方法特定值分別存儲在堆棧中的相應塊中。沒有阻止編譯器執(zhí)行此操作的限制。Singleton 類對 JVM 的唯一限制是它只能在堆中擁有此類的一個實例。這就是為什么理想的單例 bean 必須是無狀態(tài)的。否則可能會出現(xiàn)并發(fā)問題。
以上就是詳解Spring中singleton bean如何同時服務多個請求的詳細內容,更多關于Spring singleton bean多個請求的資料請關注腳本之家其它相關文章!
相關文章
java操作json對象出現(xiàn)StackOverflow錯誤的問題及解決
這篇文章主要介紹了java操作json對象出現(xiàn)StackOverflow錯誤的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
springMVC+jersey實現(xiàn)跨服務器文件上傳
這篇文章主要介紹了springMVC+jersey實現(xiàn)跨服務器文件上傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08

