В нашем весеннем приложении мы используем HttpServletRequest
двумя способами:не могу понять `@Autowired HttpServletRequest` весна-MVC хорошо
(код здесь Simplied, и кажется бессмысленным)
В контроллере:
@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()
в контроллере всегда отличается (как я ожидал)request.hashCode()
вRequestService
всегда то же самое (как я думал)- Но значение заголовка отличается, если я выдаю запрос с другим заголовком
abc
!!!
Кажется, для одноточечного RequestService
, пружина удерживает экземпляр request
, но изменил заголовки, которые он содержит!
Как это понять?