SpringBoot--@Autowired注入HttpServletRequest是否线程安全?

原文网址:SpringBoot--@Autowired注入HttpServletRequest是否线程安全?_IT利刃出鞘的博客-CSDN博客

简介

本文用实例结合源码来说明@Autowired注入HttpServletRequest是线程安全的。

SpringBoot获取HttpServletRequest有多种方式,见:SpringBoot--获取request(HttpServletRequest)的方法_IT利刃出鞘的博客-CSDN博客,其中一种方法是:在Controller中使用@Autowired注入HttpServletRequest,它是一个公共的变量,肯定就要怀疑它的线程安全性:多个请求同时进来时,使用这个request是线程安全的吗?

结论是:是线程安全的。

实例

代码

package com.knife.example.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
@Slf4j
public class HelloController {
    @Autowired
    private HttpServletRequest request;

    @GetMapping("/test")
    public String test(String id) {

        request.setAttribute("id", id);

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("time值:{},线程名:{},request地址:{}",
                request.getAttribute("id"),
                Thread.currentThread().getName(),
                request);
        return "success";
    }
}

测试

用jmeter发起10个并发请求,请求的url是:http://localhost:8080/test?id=1
(请求的id从1到10)

结果:

2023-05-11 17:51:57.045  INFO 5348 --- [nio-8080-exec-9] c.k.example.controller.HelloController   : time值:1,线程名:http-nio-8080-exec-9,request地址:Current HttpServletRequest
2023-05-11 17:51:57.045  INFO 5348 --- [nio-8080-exec-1] c.k.example.controller.HelloController   : time值:3,线程名:http-nio-8080-exec-1,request地址:Current HttpServletRequest
2023-05-11 17:51:57.045  INFO 5348 --- [nio-8080-exec-4] c.k.example.controller.HelloController   : time值:2,线程名:http-nio-8080-exec-4,request地址:Current HttpServletRequest
2023-05-11 17:51:57.053  INFO 5348 --- [nio-8080-exec-3] c.k.example.controller.HelloController   : time值:8,线程名:http-nio-8080-exec-3,request地址:Current HttpServletRequest
2023-05-11 17:51:57.053  INFO 5348 --- [nio-8080-exec-2] c.k.example.controller.HelloController   : time值:9,线程名:http-nio-8080-exec-2,request地址:Current HttpServletRequest
2023-05-11 17:51:57.053  INFO 5348 --- [io-8080-exec-10] c.k.example.controller.HelloController   : time值:6,线程名:http-nio-8080-exec-10,request地址:Current HttpServletRequest
2023-05-11 17:51:57.053  INFO 5348 --- [nio-8080-exec-5] c.k.example.controller.HelloController   : time值:4,线程名:http-nio-8080-exec-5,request地址:Current HttpServletRequest
2023-05-11 17:51:57.053  INFO 5348 --- [nio-8080-exec-7] c.k.example.controller.HelloController   : time值:10,线程名:http-nio-8080-exec-7,request地址:Current HttpServletRequest
2023-05-11 17:51:57.053  INFO 5348 --- [io-8080-exec-11] c.k.example.controller.HelloController   : time值:7,线程名:http-nio-8080-exec-11,request地址:Current HttpServletRequest
2023-05-11 17:51:57.053  INFO 5348 --- [nio-8080-exec-6] c.k.example.controller.HelloController   : time值:5,线程名:http-nio-8080-exec-6,request地址:Current HttpServletRequest

可以发现:在同一时间虽然有多个请求进来,但使用request是线程安全的。 

源码分析

可以打断点跟踪源码,本处贴出流程:

简要描述其流程:

通过@Autowired注入的Request对象,其实并非是原生的HttpServletRequest对象,而是由Spring通过JDK动态代理技术生成的一个代理对象。

代理对象只是一个空壳,本身不具备功能,所有的操作都让RequestObjectFactory.getObject()返回的对象去处理了。而RequestObjectFactory.getObject()底层就是从RequestContextHolder的ThreadLocal变量requestAttributesHolder获取的。

说白了,从代码上看似是多个线程并发操作一个共享变量request,其实Spring底层通过一个代理对象让客户端去操作了ThreadLocal中的request,即每个线程都只操作自己的request,是线程隔离的,所以不存在并发安全问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/627244.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

免费思维13招之十二:耗材型思维

免费思维13招之十二:耗材型思维 今天给你分享免费思维的两个子思维——相关性耗材思维和非相关性耗材思维。 相关性耗材思维,是指有一些产品的使用,需要大量的相关耗材,从而对该产品进行免费,而耗材进行资费。 举例:全世界最大的一家直销公司叫安利,它的明星产品是净水…

Axure网上超市用户端APP原型 (O2O生鲜电商/买菜到家/数字零售/京东到家/抖音超市领域)

作品概况 页面数量:共 100 页 源文件格式:rp格式,兼容 Axure RP 9/10,非程序软件无源代码 适用领域:O2O生鲜电商、网上超市、买菜到家、数字零售 作品特色 本作品为网上超市用户消费端Axure交互原型,属于…

BUUCTF——大流量分析一、二、三题

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

Spring Boot:异常处理

Spring Boot 前言使用自定义错误页面处理异常使用 ExceptionHandler 注解处理异常使用 ControllerAdvice 注解处理异常使用配置类处理异常使用自定义类处理异常 前言 在 Spring Boot 中,异常处理是一个重要的部分,可以允许开发者优雅地处理应用程序中可…

Spring WebFlux 初探-响应式编程-021

🤗 ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Nex…

[HUBUCTF 2022 新生赛]ezsql

测试无结果 扫描目录,得到源码 找到注入点 思路:更新资料的时候可以同时更新所有密码 我们需要知道密码的字段名 爆库 nicknameasdf&age111,description(select database())#&descriptionaaa&token31ad6e5a2534a91ed634aca0b27c14a9 爆表…

外网ip地址怎么获取?快解析

大家都清楚互联网是通过ip地址通信的,ip地址又分内网ip和外网ip。内网ip只能在内网使用;而外网ip作为电脑唯一标识,可在公网使用。那么外网ip地址怎么获取呢? 外网ip是网络运营商分配给用户的。目前最常见的两种上网方式一个是拉…

Muse论文精读

Muse Abstract 我们介绍了Muse,一个文本到图像的Transformer模型,它实现了最先进的图像生成性能,同时比扩散或自回归模型更有效。Muse是在离散标记空间中的掩码建模任务上进行训练的:给定从预训练的大型语言模型(LLM)中提取的文本嵌入&…

【保姆级介绍下运维】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

nginx反向代理使用(详细版)

1. 下载nginx,解压;(随便放在哪里) 2. 在nginx-1.26.0文件夹下创建web文件夹,继续在web文件夹下创建abcd.test.cn文件夹(文件夹的名字就叫abcd.test.cn); 3. 配置前端代理&#xff…

【现代C++】三路比较运算符

C20引入了三路比较运算符&#xff08;也称为太空船运算符&#xff0c;<>&#xff09;&#xff0c;它允许同时比较两个值&#xff0c;并返回它们的相对顺序。这个运算符简化了需要定义多个比较运算符&#xff08;如、!、<、<、>、>&#xff09;的类的代码&…

吞吐量 和 延时的关系

关于吞吐量/吞吐率、延时&#xff0c;你可以通过 Jmeter中的”聚合报告“和”用表格查看报告“来获取。 Throughput 越大&#xff0c;Latency 越差&#xff1a;因为请求过多&#xff0c;系统繁忙导致响应速度降低。Latency 的值越小说明能支持的 Throughput 越高&#xff1a;L…

全像宇宙投影第三部时间与空间(全文)下载

当这个人向空中凝视时&#xff0c;他所在的房间渐渐变得透明而朦胧&#xff0c;空中渐渐浮现一个久远前景像。突然他觉得自己在皇宫中庭内&#xff0c;他面前站著一位年轻女士非常美丽&#xff0c;有著橄榄色的皮肤。他可以见到她的颈项、手腕、脚踝上都挂著金饰&#xff0c;还…

如何使用AzurEnum快速枚举Microsoft Entra ID(Azure AD)

AzurEnum是一款针对Azure的安全工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松快速地枚举Microsoft Entra ID&#xff08;Azure AD&#xff09;。 该工具基于纯Python 3开发&#xff0c;可以在Windows和Linux系统上运行&#xff0c;但考虑到性能和稳定性&a…

windows下mysql5.6下载安装(多实例安装)

目录 1、下载 2、安装步骤 3、mysql多实例安装 1、下载 http://dev.mysql.com/downloads/windows/installer/5.6.html 2、安装步骤 我们采用自定义安装模式&#xff1a;选择32位或64位 默认即可&#xff1a; 说明&#xff0c;如果没有该页面就上一步&#xff0c;选择高级选…

类人速度超快语音响应!OpenAI推出新旗舰模型GPT-4o,图文音频手机AI搞定

内容概述 虽然没有带来备受期待的人工智能&#xff08;AI&#xff09;搜索引擎&#xff0c;但OpenAI在主打产品AI模型上花了更多心思&#xff0c;拓展多模态功能&#xff0c;让用户可以免费玩转文字、图片和语音输入。 美东时间5月13日周一&#xff0c;OpenAI首席技术官Mira …

三星将采用铁电材料实现1000层3D NAND

在2022年的技术日上&#xff0c;三星公布了一项宏伟目标&#xff0c;即到2030年推出层数超过1000层的先进NAND芯片。据Wccftech报道&#xff0c;这家韩国存储巨头似乎正逐步接近这一目标&#xff0c;计划在NAND芯片制造中应用新型“铁电”材料。 最近美国火奴鲁鲁举行的VLSI技术…

学习Uni-app开发小程序Day11

今天是学习的第11天&#xff0c;今天学习了组件的生命周期&#xff0c;这里的生命周期&#xff0c;主要是学习uni-app的组件生命周期&#xff0c;虽然vue也有&#xff0c;但主要还是学习uni-app的。1. onLoad 监听页面加载&#xff0c;该钩子被调用时&#xff0c;响应式数据、计…

2024 年第一季度全球互联网中断事件

2024 年第一季度伊始&#xff0c;互联网发生了多起中断事件。陆地和海底电缆的损坏在多个地方造成了问题&#xff0c;而与持续中地缘政治冲突相关的军事行动影响了其他地区的连接。 几个非洲国家以及巴基斯坦的政府下令关闭互联网&#xff0c;主要针对移动网络连接。 被称为Ano…

Taylor Francis科技期刊数据库文献去哪里获取

一、Taylor & Francis科技期刊数据库简介&#xff1a; Taylor & Francis 科技期刊数据库&#xff08;T&F ST Library&#xff09;提供超过520种经专家评审的高质量科学与技术类期刊, 其中超过85%的期刊被Web of Science收录&#xff0c;内容最早至1997年。该科技期…