• 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的设计初衷考虑,还有从多线程设计思路及代码思路考虑,尽量不要用全局变量。因为这容易引入并发问题......

  • 相关阅读:
    [转]wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容) 实例介绍
    [转]HTTPS连接的前几毫秒发生了什么
    将生成的数据写入文件
    linux查看网络监听端口
    [转] Linux下移动virtualbox虚拟硬盘丢失eth0
    sockaddr结构体
    以十六进制形式打印字符串
    pta5-9 Huffman Codes (30分)
    pat1068. Find More Coins (30)
    hduoj 2955Robberies
  • 原文地址:https://www.cnblogs.com/huzi007/p/6731831.html
Copyright © 2020-2023  润新知