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 singletonRequestServicea mola mantem orequest instância, mas alterou os cabeçalhos que ele contém!

Como entender isso?

questionAnswers(1)

yourAnswerToTheQuestion