2013-09-05 10 views
5

में LocaleContextHolder सुरक्षित है आधिकारिक दस्तावेज़ के अनुसार, LocaleContextHolder है:सेवा परत

सरल धारक वर्ग है कि मौजूदा धागे से एक LocaleContext उदाहरण एकत्रित करती है।

तो यह वर्तमान thread से जुड़ा हुआ है, लेकिन इस Thread धागे या वर्तमान अनुरोध की एक धागा बारे में बात कर रहा है।

अगर यह एक बेवकूफ सवाल है, तो क्षमा करें, मैं लोकेल कॉन्टेक्स्टहोल्डर नहीं हूं, किसी HTTP सत्र या किसी चीज़ से बंधे नहीं है ताकि किसी भी सेवा परत वर्ग में उपयोग करना सुरक्षित हो।

उत्तर

10

आप LocaleContextHolder के लिए स्रोत कोड को देखो, तो आप इसे एक ThreadLocal चर है देखेंगे (यह दो वास्तव में है)

private static final ThreadLocal<LocaleContext> localeContextHolder = 
     new NamedThreadLocal<LocaleContext>("Locale context"); 

आप, क्या एक ThreadLocal है के बारे में है, लेकिन हमारे लिए पढ़ सकते हैं इस बात पर विचार एक डेटा संरचना जो वर्तमान निष्पादन थ्रेड की आईडी को अपने सामान्य प्रकार, LocaleContext के किसी ऑब्जेक्ट पर मैप करती है।

एक सर्वलेट कंटेनर में धागे का एक पूल होता है जो क्लाइंट अनुरोधों को संभालने के लिए उपयोग करता है। जब कोई अनुरोध आता है, तो यह इन धागे में से एक निकाल देगा और आपके सर्वलेट की service() विधि निष्पादित करेगा। वसंत के साथ, परिणामस्वरूप DispatcherServlet निष्पादन और आपके @Controller के हैंडलर विधि को बुलाया जा रहा है। यह सब उस मूल Thread सर्वलेट कंटेनर में चुना जाता है।

तो जब आपकी @Service कक्षा 'विधि कॉल हो जाती है, तो आप अभी भी उसी धागे में हैं।

ThreadLocalLocaleContextHolder में विधि initContextHolders()doGet(), doPost() में से प्रत्येक में processRequest() द्वारा कहा जाता है, आदि तरीकों (जो DispatcherServlet की मूल प्रकार है) FrameworkServlet में अनुरोध प्रसंस्करण में कुछ बिंदु जल्दी पर पर set() है। LocaleHttpServletRequest से getLocale() विधि के साथ बनाया गया है।

+0

बहुत अच्छी स्पष्टीकरण, मुझे इस तरह के सार प्राप्त करने के लिए बहुत सी पढ़ाई बचाओ। एक और सवाल यह है कि कंटेनर में धागे का एक पूल होता है, एक 'लोकेल कॉन्टेक्स्टहोल्डर प्रति थ्रेड' तो क्या इसका मतलब यह है कि प्रत्येक 'धागा' का समर्थन 'डिस्पैच सर्लेट' और प्रत्येक 'प्रेषण' को 'लोकेल कॉन्टेक्सहोल्डर' रखता है? अग्रिम में धन्यवाद। – Dreamer

+2

@ ड्रीमर बिल्कुल नहीं। प्रत्येक थ्रेड में 'लोकेल कॉन्टेक्स्ट' होगा (यदि यह 'थ्रेडलोकल' पर 'सेट()' है)। सर्वलेट कंटेनर द्वारा उत्पन्न 'थ्रेड' में 'रन()' विधि है जिसमें आपके 'डिस्पैचर सर्वलेट' का संदर्भ है जिसका उपयोग 'HttpServletRequest' और' HttpServletREsponse' ऑब्जेक्ट्स 'के साथ विधियों को कॉल करने के लिए किया जाता है। आपके '@ नियंत्रक' विधियों में 'डिस्पैटर सर्वलेट _ _ispatches_। 'लोकेल कोंटेक्सहोल्डर' 'लोकेल कोंटेक्सहोल्डर' वर्ग का 'स्थिर' फ़ील्ड है। –

+0

महान जवाब! – Dreamer

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