• springmvc httprequest 使用@Autowired注解


    springmvc httprequest 使用@Autowired注解我一直有个疑问,就是注解后每次的httprequest 是不是都一样的了,然后会不会引发多线程问题?

    代码如下:

    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class TestController{
    
        @Autowired
        HttpServletRequest request1;//这样使用,request1每次进来都是Current Request
    
        @RequestMapping("/test1")
        public void test(){
             System.out.println("test1request1:"+request1.hashCode());
             System.out.println("test1"+request1.getParameter("name"));
        }
        
        @RequestMapping("/test2")
        public void test2(String name){
             System.out.println("request2request2:"+request1.hashCode());
             System.out.println("test2"+request1.getParameter("name"));
        }
        
        @RequestMapping("/test3")
        public void test3(HttpServletRequest request){
            //这样进来request每次都不一样
            System.out.println("request:"+request1.hashCode());
            
        }
        
    }

    springmvc常见注入HttpServletRequest 是使用方法级别注入的,它的基本思想是一个请求就是一个新实列HttpServletRequest,所以不会出现所谓多线程问题,毕竟是局部变量控制了。

    而我们使用@Autowired来注入一个全局实例是否会出现多线程问题?跟踪源码,发现当前注入每次Current Request,然后这个request其实保存在一个ThreadLocal中的,这样其实它的底层实现方法就是针对每次来的request都保存在一个ThreadLocal中,然后去取,所以这样写代码是没有问题的。

    总结一下两种写法都没有问题。但是用得最多的是第一种写法,毕竟我们还是要顺着springmvc的设计初衷考虑,还有从多线程设计思路及代码思路考虑,尽量不要用全局变量。因为这容易引入并发问题......

  • 相关阅读:
    自动跳转至首页(Java Script)
    简单的轮播图(Java Script)
    蓝桥杯 2016年 第七届 四平方和(JAVA)
    蓝桥杯 2016年 第七届 剪邮票(JAVA)
    蓝桥杯 2015年 第六届 生命之树(JAVA)
    蓝桥杯 2015年 第六届 垒骰子(JAVA)
    numpy笔记
    opencv安装和运行
    vs code环境配置注意点
    numpy中matrix使用方法
  • 原文地址:https://www.cnblogs.com/huzi007/p/6731831.html
Copyright © 2020-2023  润新知