由HttpServletRequest的传值引发的线程安全性问题

本文探讨了在Spring项目中,通过HttpServletRequest传递值可能导致的线程安全问题。由于Spring默认bean为单例,当HttpServletRequest作为业务层属性时,可能会在并发情况下引发问题。文章列举了三种解决方案:通过方法参数传值、设置Controller作用域为prototype以及使用ThreadLocal。同时,文章介绍了Spring如何通过RequestContextHolder和ThreadLocal确保线程安全,解析了Spring在处理请求时的相关源码逻辑。
摘要由CSDN通过智能技术生成

最近看了下之前项目的代码,发现有同事写了类似如下的代码结构:

1、控制层

@RestController
public class TestController {
    @Autowired
    private ITestBizc testBizc;

    @ModelAttribute
    public void init(HttpServletRequest request){
        testBizc.setRequest(request);
    }

}

2、业务层

@Repository
public class TestBizc implements ITestBizc {
    private HttpServletRequest httpServletRequest;

    @Override
    public void setRequest(HttpServletRequest httpServletRequest) {
        this.httpServletRequest = httpServletRequest;
    }
}

HttpServletRequest对象代表客户端的请求,这边的操作目的是为了从控制层传request对象到业务层,并利用@ModelAttribute,使得每个请求方法都先执行传值操作。我们先不讨论其他的做法,就单纯看这样做会导致什么问题。

Spring默认设置每个bean都是单例的,这意味着每个request过来,系统都会用原有的实例去处理 ,这样可以减少对象的创建与垃圾回收的消耗,但是这也就带来了另外一个问题,共享变量的线程安全性问题。就上面的例子而言,我们发现TestBizc将HttpServletRequest设置成

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值