2015-01-19 4 views
5

हमारे वसंत आवेदन में की है, हम दो तरह से HttpServletRequest का उपयोग करें:नहीं समझा जा सकता `@Autowired HttpServletRequest` वसंत-MVC अच्छी तरह से

(कोड यहाँ सरलीकृत कर रहे हैं, और अर्थहीन लगता है)

  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 उदाहरण इंजेक्ट करना चाहिए। इसलिए कोई फर्क नहीं पड़ता कि जब मैं getHeaderAbc() विधि का आह्वान करता हूं, तो उसे वही मान (पहले अनुरोध का) वापस करना चाहिए।

लेकिन जब मैंने उसे कोशिश की, तो पाया कई दिलचस्प बातें:

  1. request.hashCode() नियंत्रक में हमेशा से अलग है (जैसा कि मैंने उम्मीद)
  2. request.hashCode()RequestService में हमेशा एक ही है (जैसा कि मैंने सोचा था कि)
  3. लेकिन यदि मैं एक अलग शीर्षलेख abc के साथ अनुरोध जारी करता हूं तो हेडर मान भिन्न होता है !!!

यह सिंगलटन RequestService के लिए लगता है, वसंत request उदाहरण रखती है, बल्कि हेडर इसमें बदल गया है!

इसे कैसे समझें?

उत्तर

7

स्कॉप्ड प्रॉक्सी पर एक नज़र डालें। http://www.java-allandsundry.com/2012/08/spring-scoped-proxy.html मूल रूप से आप एक प्रॉक्सी इंजेक्ट करते हैं जो वर्तमान HttpRequest सेम के संदर्भ रखता है और आपको अनुरोध आईडी द्वारा इसे चुनने का अधिकार देता है।

वेब परत के बाहर HttpRequest का उपयोग करके IMHO एक अच्छा अभ्यास नहीं है। मैं इसे केवल controlellrs में उपयोग करेंगे।

संबंधित मुद्दे