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的設計初衷考慮,還有從多線程設計思路及代碼思路考慮,盡量不要用全局變量。因為這容易引入並發問題......

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM