春のアプリケーションでは、次HttpServletRequest
の 2 つの方法で使用します。
(ここのコードは単純化されており、意味がないようです)
コントローラーで:
@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
最初は、インスタンスを 1 回だけ注入する必要があるため、2 番目の方法は完全に間違っていると考えていました。したがって、いつgetHeaderAbc()
メソッドを呼び出しても、(最初のリクエストの) 同じ値を返す必要があります。
しかし、試してみると、いくつかの興味深いことがわかりました。
request.hashCode()
inコントローラーは常に異なります(予想どおり)- イン
request.hashCode()
はRequestService
いつも同じ(思った通り) - しかし、別のヘッダーでリクエストを発行すると、ヘッダーの値が異なります
abc
!!!
シングルトンのようですがRequestService
、スプリングはrequest
インスタンスを保持しますが、含まれるヘッダーを変更しました!
それを理解する方法は?