在我们的spring应用中,我们HttpServletRequest
以两种方式使用:
(这里的代码很简单,看起来毫无意义)
在控制器中:
@RequestMapping(value = "/hello", method = RequestMethod.GET) @ResponseBody public ResponseEntity<String> hello(HttpServletRequest request) { System.out.println("## controller req.hashcode: " + request.hashCode()); System.out.println("## header 'abc': " + request.getHeader("abc")); return new ResponseEntity<String>("OK", HttpStatus.OK); }
在普通组件中:
@Component class RequestService { private final HttpServletRequest request; @Autowired public RequestService(HttpServletRequest request) { this.request = request; } public String getHeaderAbc() { System.out.println("## service req.hashcode: " + request.hashCode()); return this.request.getHeader("abc"); } }
起初,我认为第二种方式是完全错误的,因为它应该只注入request
一次实例。所以无论我何时调用getHeaderAbc()
方法,它都应该返回相同的值(第一个请求的)。
但是当我尝试它时,我发现了几个有趣的事情:
request.hashCode()
in 控制器总是不同的(如我所料)request.hashCode()
inRequestService
总是一样的(就像我想的那样)- 但是,如果我发出带有不同标头的请求,标头值会有所不同
abc
!!!
似乎对于单例RequestService
,spring 保留了request
实例,但更改了它包含的标头!
怎么理解?