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