हमारे वसंत आवेदन में की है, हम दो तरह से HttpServletRequest
का उपयोग करें:नहीं समझा जा सकता `@Autowired HttpServletRequest` वसंत-MVC अच्छी तरह से
(कोड यहाँ सरलीकृत कर रहे हैं, और अर्थहीन लगता है)
नियंत्रक में:
@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
उदाहरण इंजेक्ट करना चाहिए। इसलिए कोई फर्क नहीं पड़ता कि जब मैं getHeaderAbc()
विधि का आह्वान करता हूं, तो उसे वही मान (पहले अनुरोध का) वापस करना चाहिए।
लेकिन जब मैंने उसे कोशिश की, तो पाया कई दिलचस्प बातें:
request.hashCode()
नियंत्रक में हमेशा से अलग है (जैसा कि मैंने उम्मीद)request.hashCode()
RequestService
में हमेशा एक ही है (जैसा कि मैंने सोचा था कि)- लेकिन यदि मैं एक अलग शीर्षलेख
abc
के साथ अनुरोध जारी करता हूं तो हेडर मान भिन्न होता है !!!
यह सिंगलटन RequestService
के लिए लगता है, वसंत request
उदाहरण रखती है, बल्कि हेडर इसमें बदल गया है!
इसे कैसे समझें?