最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Spring中singleton?bean如何同時(shí)服務(wù)多個(gè)請(qǐng)求

 更新時(shí)間:2023年02月07日 14:04:43   作者:小水滴滴滴  
這篇文章主要介紹了詳解Spring中singleton?bean如何同時(shí)服務(wù)多個(gè)請(qǐng)求

正文

當(dāng)我開始學(xué)習(xí) Spring 時(shí),兩個(gè)“難”的問題主要在我腦海中盤旋:

  • 如何創(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)描述它們。讓我們開始:

先講一下Spring容器

因?yàn)槲艺J(rèn)為這會(huì)幫助你在腦海中更好地描述過程。

Spring 容器在其中創(chuàng)建 bean。創(chuàng)建所需的 bean 后,它會(huì)注入它們的依賴項(xiàng)。容器通過讀取配置元數(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è)線程都可以訪問堆中的對(duì)象。

但是堆棧僅用于執(zhí)行一個(gè)線程。在那個(gè)線程中,當(dāng)一個(gè)方法被調(diào)用時(shí),一個(gè)新的塊會(huì)以 LIFO(Last-In-First-Out) 順序在堆棧中創(chuàng)建。該塊保存本地原始值和對(duì)方法中其他對(duì)象的引用。并且棧內(nèi)存不能被其他線程訪問。

所以當(dāng)我們創(chuàng)建單例 bean 時(shí),它駐留在堆中。由于可以從應(yīng)用程序的任何位置訪問堆,因此每個(gè)創(chuàng)建的線程都可以指向該單例 bean。這是怎么發(fā)生的?當(dāng)線程請(qǐng)求單例bean時(shí),它會(huì)(借助堆棧中的引用變量)引用堆中單例bean的字節(jié)碼。所以多個(gè)線程可以同時(shí)引用單例bean。編譯器將指向相同的字節(jié)碼并簡(jiǎn)單地執(zhí)行它并將方法特定值分別存儲(chǔ)在堆棧中的相應(yīng)塊中。沒有阻止編譯器執(zhí)行此操作的限制。Singleton 類對(duì) JVM 的唯一限制是它只能在堆中擁有此類的一個(gè)實(shí)例。這就是為什么理想的單例 bean 必須是無(wú)狀態(tài)的。否則可能會(huì)出現(xiàn)并發(fā)問題。

以上就是詳解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)文章

  • Java之Set?交集,差集,并集的用法

    Java之Set?交集,差集,并集的用法

    這篇文章主要介紹了Java之Set?交集,差集,并集的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • ActiveMQ消息簽收機(jī)制代碼實(shí)例詳解

    ActiveMQ消息簽收機(jī)制代碼實(shí)例詳解

    這篇文章主要介紹了ActiveMQ消息簽收機(jī)制代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • java操作json對(duì)象出現(xiàn)StackOverflow錯(cuò)誤的問題及解決

    java操作json對(duì)象出現(xiàn)StackOverflow錯(cuò)誤的問題及解決

    這篇文章主要介紹了java操作json對(duì)象出現(xiàn)StackOverflow錯(cuò)誤的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java程序包不存在問題的解決辦法

    Java程序包不存在問題的解決辦法

    最近工作中遇到個(gè)問題,代碼中沒有報(bào)錯(cuò),啟動(dòng)時(shí)報(bào)錯(cuò),但是程序包不存在,這篇文章主要給大家介紹了關(guān)于Java程序包不存在問題的解決辦法,需要的朋友可以參考下
    2022-06-06
  • springMVC+jersey實(shí)現(xiàn)跨服務(wù)器文件上傳

    springMVC+jersey實(shí)現(xiàn)跨服務(wù)器文件上傳

    這篇文章主要介紹了springMVC+jersey實(shí)現(xiàn)跨服務(wù)器文件上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • JavaWeb中的Response常用方法解析

    JavaWeb中的Response常用方法解析

    這篇文章主要介紹了JavaWeb中的Response常用方法解析,response對(duì)象是用來(lái)對(duì)客戶端進(jìn)行響應(yīng)的當(dāng)瀏覽器發(fā)出請(qǐng)求時(shí),?Web容器創(chuàng)建一個(gè)ServletRequest對(duì)象封裝請(qǐng)求信息,一個(gè)ServletResponse對(duì)象封裝響應(yīng)信息,對(duì)象作為Servlet的service()方法中的參數(shù),需要的朋友可以參考下
    2023-11-11
  • Java計(jì)算器核心算法代碼實(shí)現(xiàn)

    Java計(jì)算器核心算法代碼實(shí)現(xiàn)

    今天小編就為大家分享一篇關(guān)于Java計(jì)算器核心算法代碼實(shí)現(xiàn),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Java編程中的equals方法使用全解

    Java編程中的equals方法使用全解

    這篇文章主要介紹了Java編程中的equals方法使用全解,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • 關(guān)于IDEA配置Hibernate中遇到的問題解決

    關(guān)于IDEA配置Hibernate中遇到的問題解決

    這篇文章主要給大家介紹了關(guān)于IDEA配置Hibernate中遇到的問題,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Spring自定義注解的實(shí)現(xiàn)與使用方式

    Spring自定義注解的實(shí)現(xiàn)與使用方式

    注解是Java中用于類、方法、參數(shù)、包的裝飾標(biāo)志,本身不具備功能,但可定義參數(shù),Java包含內(nèi)建注解和元注解,如@Target、@Retention等,描述注解的使用范圍和生命周期,Spring的AOP(面向切面編程)可以結(jié)合注解實(shí)現(xiàn)功能,如權(quán)限控制和日志記錄
    2024-09-09

最新評(píng)論

金川县| 建昌县| 响水县| 东乡| 南溪县| 姜堰市| 淄博市| 游戏| 桂阳县| 山东| 沙河市| 朝阳市| 松滋市| 弋阳县| 腾冲县| 通城县| 天柱县| 加查县| 巴东县| 福泉市| 新邵县| 尤溪县| 仙游县| 达尔| 北京市| 景洪市| 利辛县| 汽车| 保亭| 南投县| 边坝县| 资溪县| 东丰县| 南涧| 阜阳市| 时尚| 隆子县| 潍坊市| 同心县| 应用必备| 横山县|