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

  • 相关阅读:
    NORDIC BLE MAC ADDR
    dbm和发射功率得对照表
    git切换账号邮箱
    文件编码问题造成的汉字输出乱码问题
    自定义printf 打印函数
    NORDIC 烧录BLE协议栈后不能用JLINK仿真bootloader问题及修改方案
    NORDIC BLE升级
    NORDIC ble RSSI
    NORDIC 错误文件
    NORDIC 协议栈下使用硬件定时器
  • 原文地址:https://www.cnblogs.com/huzi007/p/6731831.html
Copyright © 2011-2022 走看看