6

春のアプリケーションでは、次HttpServletRequestの 2 つの方法で使用します。

(ここのコードは単純化されており、意味がないようです)

  1. コントローラーで:

    @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);
    }
    
  2. 通常のコンポーネントでは:

    @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()メソッドを呼び出しても、(最初のリクエストの) 同じ値を返す必要があります。

しかし、試してみると、いくつかの興味深いことがわかりました。

  1. request.hashCode()inコントローラーは常に異なります(予想どおり)
  2. インrequest.hashCode()RequestServiceいつも同じ(思った通り)
  3. しかし、別のヘッダーでリクエストを発行すると、ヘッダーの値が異なりますabc!!!

シングルトンのようですがRequestService、スプリングはrequestインスタンスを保持しますが、含まれるヘッダーを変更しました!

それを理解する方法は?

4

1 に答える 1