【Spring】 Bean 注入 HttpServletRequest 能保證線程安全的原理

文章目錄

    • 前言
    • 1. 圖示
    • 2. 源碼坐標
    • 后記

前言

今天看了一段老業務代碼,HttpServletRequest 被注入后直接用于業務邏輯。
好奇Spring是如何解決線程安全問題。

@Controller
public class TestController {@ResourceHttpServletRequest request;@ResponseBody@GetMapping("/test")public String test() {return request.getQueryString();}
}

本質問題是 Spring 如何裝配 Controller 中 HttpServletRequest 的bean依賴

1. 圖示

在這里插入圖片描述

2. 源碼坐標

可以在代碼層面打斷點驗證,版本:SpringBoot 2.7.5 (自行集成WebStarter)

  • 加載web相關的bean定義
ServletWebServerApplicationContext.java:141
  • 設置工廠
WebApplicationContextUtils#registerWebApplicationScopes(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, javax.servlet.ServletContext)
  • 具體的工廠方法定義(定義是從線程中取request)
RequestObjectFactory#getObject
// 關鍵代碼塊
@Override
public ServletRequest getObject() {return currentRequestAttributes().getRequest();
}
  • 啟動時解析依賴,將工廠方法植入
org.springframework.beans.factory.support.DefaultListableBeanFactory#doResolveDependency
org.springframework.beans.factory.support.DefaultListableBeanFactory#findAutowireCandidates
org.springframework.beans.factory.support.AutowireUtils#resolveAutowiringValue
  • 接收請求
FrameworkServlet.java:1003  將響應放在ThreadLocal
// 關鍵代碼塊
if (requestAttributes != null) {RequestContextHolder.setRequestAttributes(requestAttributes, this.threadContextInheritable);
}
  • 回調工廠方法創建 Request
AutowireUtils.java:292
// 關鍵代碼
return method.invoke(this.objectFactory.getObject(), args)

后記

  • 解決 HttpServletRequest 的線程安全問題的思路
    • 工廠方法定義, 將 Request 的創建約束為從 ThreadLocal 中取。
    • 收到請求 ,將 Request 放入ThreadLocal 中。(請求時設置 Request)
    • Controller 實例化,使用動態代理技術回調工廠方法。(業務邏輯消費 Request)

  • 建議按官方建議替換成方法參數,語義更加清晰。
    @ResponseBody@GetMapping("/test")public String test(HttpServletRequest request) {return request.getQueryString();}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64363.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64363.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64363.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CSS面試題|[2024-12-24]

1.說一下CSS的盒模型 在HTML頁面中的所有元素都可以看成是一個盒子 盒子的組成:內容content、內邊距padding、邊框border、外邊距margin 盒模型的類型: 標準盒模型 margin border padding content IE盒模型 margin content(包括border p…

Unity中如何修改Sprite的渲染網格

首先打開SpriteEditor 選擇Custom OutLine,點擊Genrate 則在圖片邊緣會出現邊緣線,調整白色小方塊可以調整邊緣 調整后,Sprite就會按照調整后的網格渲染了。 如何在UI中使用? 只要在UI的Image組件中選擇Use Sprite Mesh 即可 結果&#xff1…

【Artificial Intelligence篇】AI 前沿探秘:開啟智能學習的超維征程

目錄 一、人工智能的蓬勃發展與智能學習的重要性: 二、數據的表示與處理 —— 智能學習的基石: 三、構建一個簡單的感知機模型 —— 智能學習的初步探索: 四、神經網絡 —— 開啟超維征程的關鍵一步: 五、超維挑戰與優化 —— 探索智能學習的深度: 六、可視化與交互 —— …

docker-compos mysql5.7主從配置

docker-compos mysql5.7主從配置 docker-compose目錄結構 配置文件 master/my.cnf [client] port 3306 socket /var/run/mysqld/mysqld.sock[mysqld_safe] pid-file /var/run/mysqld/mysqld.pid socket /var/run/mysqld/mysqld.sock nice 0…

開源輕量級文件分享服務Go File本地Docker部署與遠程訪問

???歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學習,不斷總結,共同進步,活到老學到老…

路過石巖浪心古村

周末常去的七彩城堡兒童樂園附近經常有老房子,沒想到老房子最多的地方還是浪心古村。而且越看越有歷史。 見到一座寫著《序西書室》的房子,我最開始以為是一個古代的學校。但是查了百度更加不知道什么意思了哈。?“序西書室”?是指《文心雕龍》中的一個…

面經hwl

線程進程協程區別 線程、進程和協程是計算機編程中常見的三個并發模型,它們各自有不同的特點和應用場景: 1. 進程 (Process) 定義: 進程是操作系統中資源分配的基本單位,代表一個正在運行的程序實例。特點: 獨立性: 每個進程有自己獨立的內…

【每日學點鴻蒙知識】PersistentStorage持久化、插槽方法、相對布局、上拉加載下拉刷新、List聯動滑動

1、HarmonyOS 使用PersistentStorage持久化用戶信息無效? 在首頁通過StorageLink(‘userInfoTest’) userInfoTest: string 獲取,獲不到,返回undefind。是什么原因呢? 首先在首頁時,在Entry外聲明PersistentStorage…

torch.tensor

torch.tensor 通過復制數據構造一個張量 (構造出的張量是一個沒有自動微分(autograd )歷史的張量,也稱為葉張量,參考Autograd mechanics)。 torch.tensor(data, *, dtypeNone, deviceNone, requires_gra…

探索PyTorch:從入門到實踐的demo全解析

探索PyTorch:從入門到實踐的demo全解析 一、環境搭建:PyTorch的基石(一)選擇你的“利器”:安裝方式解析(二)步步為營:詳細安裝步驟指南二、基礎入門demo:點亮第一盞燈(一)張量操作:深度學習的“積木”(二)自動求導:模型學習的“幕后英雄”三、數據處理demo:喂飽…

SpringMVC學習(二)——RESTful API、攔截器、異常處理、數據類型轉換

一、RESTful (一)RESTful概述 RESTful是一種軟件架構風格,用于設計網絡應用程序。REST是“Representational State Transfer”的縮寫,中文意思是“表現層狀態轉移”。它基于客戶端-服務器模型和無狀態操作,以及使用HTTP請求來處理數據。RES…

Windows中安裝Python3

Windows中安裝Python3 1. 下載Python安裝包 首先,訪問Python的官方網站 Python.org,選擇適合你Windows版本的Python安裝包。 2. 運行安裝包 下載完成.exe文件后,雙擊運行安裝包。在安裝過程中,有一些關鍵的選項需要特別注意&a…

JS數值類型中特殊數值NaN(Not-a-Number)理解和應用場景

NaN 的含義 在 JavaScript 中,NaN 是一種特殊的數值類型,表示 “Not-a-Number”。它通常用于標識數學運算或類型轉換的結果無法產生有效數值的情況。 特性 類型為數值: console.log(typeof NaN); // "number"盡管 NaN 表示 “不是…

虛幻引擎結構之UWorld

Uworld -> Ulevel ->Actors -> AActor 在虛幻引擎中,UWorld 類扮演著至關重要的角色,它就像是游戲世界的總指揮。作為游戲世界的核心容器,UWorld 包含了構成游戲體驗的眾多元素,從游戲實體到關卡設計,再到物…

java中logback怎么開啟異步功能

在Java中使用Logback時,開啟異步日志記錄功能可以通過配置AsyncAppender來實現。異步日志記錄可以顯著提高應用程序的性能,因為它將日志記錄操作從主線程移到了后臺線程執行,從而減少了主線程的阻塞時間。 步驟 1: 添加 Logback 配置文件 確…

2024第一屆Solar杯應急響應挑戰賽

日志流量 日志流量-1 直接放到D盾分析 解碼 flag{A7b4_X9zK_2v8N_wL5q4} 日志流量-2 哥斯拉流量 工具解一下 flag{sA4hP_89dFh_x09tY_lL4SI4} 日志流量-3 tcp流6復制data流 解碼 改pdf flag{dD7g_jk90_jnVm_aPkcs} 內存取證 內存取證-1 vol.py -f 123.raw --profileWin…

HarmonyOS Next 實現登錄注冊頁面(ARKTS) 并使用Springboot作為后端提供接口

1. HarmonyOS next ArkTS ArkTS圍繞應用開發在 TypeScript (簡稱TS)生態基礎上做了進一步擴展,繼承了TS的所有特性,是TS的超集 ArkTS在TS的基礎上擴展了struct和很多的裝飾器以達到描述UI和狀態管理的目的 以下代碼是一個基于…

Spring Boot教程之四十:使用 Jasypt 加密 Spring Boot 項目中的密碼

如何使用 Jasypt 加密 Spring Boot 項目中的密碼 在本文中,我們將學習如何加密 Spring Boot 應用程序配置文件(如 application.properties 或 application.yml)中的數據。在這些文件中,我們可以加密用戶名、密碼等。 您經常會遇到…

【Vue】如何在 Vue 3 中使用組合式 API 與 Vuex 進行狀態管理的詳細教程

如何在 Vue 3 中使用組合式 API 與 Vuex 進行狀態管理的詳細教程。 安裝 Vuex 首先,在你的 Vue 3 項目中安裝 Vuex。可以使用 npm 或 yarn: npm install vuexnext --save # or yarn add vuexnext創建 Store 在 Vue 3 中,你可以使用 creat…

七、隊列————相關概念詳解

隊列————相關概念詳解 前言一、隊列1.1 隊列是什么?1.2 隊列的類比 二、隊列的常用操作三、隊列的實現3.1 基于數組實現隊列3.1.1 基于環形數組實現的隊列3.1.2 基于動態數組實現的隊列 3.2 基于鏈表實現隊列 四、隊列的典型應用總結 前言 本篇文章,我們一起來…