Não consigo entender `@Autowired HttpServletRequest` do poço spring-mvc
Em nossa aplicação de primavera, usamosHttpServletRequest
de duas maneiras:
(o código aqui é simplificado e parece sem sentido)
No controlador:
@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);
}
Em um componente normal:
@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");
}
}
No começo, eu estava pensando que o 2º caminho é totalmente errado, porque ele deveria apenas injetar orequest
instância uma vez. Portanto, não importa quando eu invocogetHeaderAbc()
método, ele deve retornar o mesmo valor (da primeira solicitação).
Mas quando eu o experimentei, encontrei várias coisas interessantes:
orequest.hashCode()
no controlador é sempre diferente (como eu esperava)orequest.hashCode()
noRequestService
é sempre o mesmo (como eu pensava)Mas o valor do cabeçalho é diferente se eu emitir uma solicitação com um cabeçalho diferenteabc
!!!Parece para o singletonRequestService
a mola mantem orequest
instância, mas alterou os cabeçalhos que ele contém!
Como entender isso?