springMvc中在Controller中使用Autowired注入request为何不会出现线程安全问题

通过AOP+ObjectFactory+ThreadLocal实现

实现步骤:

初始化

  1. 在WebApplicationContextUtils注册依赖解析工厂,至于为何会调用此方法,需对spring 的bean初始化流程有一定的了解,可打断点追查

在这里插入图片描述

在这里插入图片描述

​ RequestObjectFactory实现
在这里插入图片描述

获取

  1. 通过调试,我们可以发现,注入的request是被代理过的

在这里插入图片描述

  1. 我们找到对应的代理类AutowireUtils类,其对应的invoke实现,我们可以看到request就是从对应的工厂(RequestObjectFactory)拿的request

在这里插入图片描述

  1. 而工厂实现中会获取ServletRequestAttributes进而获取request的,进一步追踪可看到,ServletRequestAttributesy又是从RequestContextHolder中获取的,而RequestContextHolder又是将其存放在ThreadLocal中的。

    ​

  1. 而其设置是在FrameworkServlet的initContextHolders方法中设置的,而FrameworkServlet则是Spring Mvc接收请求的Servlet

涉及到的类和方法

  1. WebApplicationContextUtils中的 registerWebApplicationScopes方法,
  2. WebApplicationContextUtils中的RequestObjectFactory静态内部类
  3. RequestContextHolder
  4. FrameworkServlet中的initContextHolders方法

版本信息

  1. SpringBoot 2.4.4
  2. Spring Mvc 5.3.5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值