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