詳解Spring中singleton?bean如何同時(shí)服務(wù)多個(gè)請(qǐng)求
正文
當(dāng)我開(kāi)始學(xué)習(xí) Spring 時(shí),兩個(gè)“難”的問(wèn)題主要在我腦海中盤旋:
- 如何創(chuàng)建單例 bean,然后如何在不同的類中自動(dòng)裝配單個(gè) bean?
- 想象一下這種情況:
有 2 個(gè)用戶,其中一個(gè)想要登錄,另一個(gè)想要同時(shí)在我們的應(yīng)用程序中創(chuàng)建報(bào)告。login 和 createReport 方法都使用范圍為單例的 userService bean。在這種情況下,這些方法是否按順序使用該單例 bean?否則 singleton bean 如何同時(shí)處理多個(gè)請(qǐng)求?
回答他們并不像我想的那么困難。只是需要澄清簡(jiǎn)單但重要的要點(diǎn)。這就是為什么我會(huì)嘗試用基本的代碼示例來(lái)描述它們。讓我們開(kāi)始:
先講一下Spring容器
因?yàn)槲艺J(rèn)為這會(huì)幫助你在腦海中更好地描述過(guò)程。
Spring 容器在其中創(chuàng)建 bean。創(chuàng)建所需的 bean 后,它會(huì)注入它們的依賴項(xiàng)。容器通過(guò)讀取配置元數(shù)據(jù)(XML 或 Java 注釋)來(lái)獲取指令。因此,在初始化 Spring 容器后,您的應(yīng)用程序就可以使用了,如下圖所示:
當(dāng)你像下面這樣定義一個(gè) bean 定義時(shí),你告訴容器它必須只為容器中的那個(gè) bean 定義創(chuàng)建一個(gè)實(shí)例:
<bean id=”accountDao” class=”…” scope=”singleton”/>
此單個(gè)實(shí)例存儲(chǔ)在此類單例 bean 的緩存中。然后 Spring 容器將這個(gè)緩存的對(duì)象返回給具有該 bean 定義的 bean 的所有請(qǐng)求和引用:
如果我們想用 new() 運(yùn)算符顯示上面的示例,以描述 Spring 容器在應(yīng)用程序啟動(dòng)時(shí)所做的簡(jiǎn)化視圖,我們可以編寫如下代碼:
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 一起工作。如何?
稍微談?wù)?Java 中的內(nèi)存分配
在 Java 中,每個(gè)對(duì)象都是在堆中創(chuàng)建的。堆是全局共享內(nèi)存。這就是為什么每個(gè)線程都可以訪問(wèn)堆中的對(duì)象。
但是堆棧僅用于執(zhí)行一個(gè)線程。在那個(gè)線程中,當(dāng)一個(gè)方法被調(diào)用時(shí),一個(gè)新的塊會(huì)以 LIFO(Last-In-First-Out) 順序在堆棧中創(chuàng)建。該塊保存本地原始值和對(duì)方法中其他對(duì)象的引用。并且棧內(nèi)存不能被其他線程訪問(wèn)。
所以當(dāng)我們創(chuàng)建單例 bean 時(shí),它駐留在堆中。由于可以從應(yīng)用程序的任何位置訪問(wèn)堆,因此每個(gè)創(chuàng)建的線程都可以指向該單例 bean。這是怎么發(fā)生的?當(dāng)線程請(qǐng)求單例bean時(shí),它會(huì)(借助堆棧中的引用變量)引用堆中單例bean的字節(jié)碼。所以多個(gè)線程可以同時(shí)引用單例bean。編譯器將指向相同的字節(jié)碼并簡(jiǎn)單地執(zhí)行它并將方法特定值分別存儲(chǔ)在堆棧中的相應(yīng)塊中。沒(méi)有阻止編譯器執(zhí)行此操作的限制。Singleton 類對(duì) JVM 的唯一限制是它只能在堆中擁有此類的一個(gè)實(shí)例。這就是為什么理想的單例 bean 必須是無(wú)狀態(tài)的。否則可能會(huì)出現(xiàn)并發(fā)問(wèn)題。
以上就是詳解Spring中singleton bean如何同時(shí)服務(wù)多個(gè)請(qǐng)求的詳細(xì)內(nèi)容,更多關(guān)于Spring singleton bean多個(gè)請(qǐng)求的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot使用Spring?Cache高效處理緩存數(shù)據(jù)
Spring?Cache是一個(gè)框架,只要簡(jiǎn)單加一個(gè)注解,就能實(shí)現(xiàn)緩存功能,本文主要介紹了SpringBoot使用Spring?Cache高效處理緩存數(shù)據(jù),感興趣的可以了解一下2023-11-11JAVA實(shí)現(xiàn)單例模式的四種方法和一些特點(diǎn)
JAVA實(shí)現(xiàn)單例模式的四種方法和一些特點(diǎn),需要的朋友可以參考一下2013-03-03Java SpringBoot 使用攔截器作為權(quán)限控制的實(shí)現(xiàn)方法
這篇文章主要介紹了Java SpringBoot 使用攔截器作為權(quán)限控制的實(shí)現(xiàn),文中通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10詳解Java的MyBatis框架和Spring框架的整合運(yùn)用
在Web端的SSH框架整合中Spring主要負(fù)責(zé)數(shù)據(jù)庫(kù)處理,而引入MyBatis后二者的集成使用效果更佳,下面我們就來(lái)詳解Java的MyBatis框架和Spring框架的整合運(yùn)用2016-06-06@PathVariable和@RequestParam傳參為空問(wèn)題及解決
這篇文章主要介紹了@PathVariable和@RequestParam傳參為空問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11springboot統(tǒng)一接口返回?cái)?shù)據(jù)的實(shí)現(xiàn)
這篇文章主要介紹了springboot統(tǒng)一接口返回?cái)?shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Spring Boot整合mybatis并自動(dòng)生成mapper和實(shí)體實(shí)例解析
本文是小編給大家總結(jié)的關(guān)于Spring Boot整合mybatis并自動(dòng)生成mapper和實(shí)體的內(nèi)容,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-05-05SpringBoot實(shí)現(xiàn)接口冪等性的4種方案
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)接口冪等性的4種方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Spring4.0 MVC請(qǐng)求json數(shù)據(jù)報(bào)406錯(cuò)誤的解決方法
這篇文章主要為大家詳細(xì)介紹了Spring4.0 MVC請(qǐng)求json數(shù)據(jù)報(bào)406錯(cuò)誤的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01