द्वारा तारों अपने प्रोजेक्ट में से परिमाण से धीमी है, मैं मेंस्प्रिंग तारों नाम
Foo foo = beanFactory.getBean(Foo.class);
लाभ स्पष्ट हैं
Foo foo = (Foo) beanFactory.getBean("name");
के सभी उपयोगों के विस्थापित करने के लिए कोशिश कर रहा हूँ: प्रकार की सुरक्षा, कम संकुचित कोड, कम बेकार स्थिरांक, आदि। आमतौर पर ऐसी रेखाएं स्थिर विरासत संदर्भों में स्थित होती हैं जहां ऐसी तारों का एकमात्र विकल्प होता है।
यह तब तक ठीक था जब तक कि एक दिन के उपयोगकर्ताओं ने स्प्रिंग इंटर्नल्स से आने वाली धीमी गति के बारे में शिकायत करना शुरू नहीं किया। इसलिए मैं
org.springframework.beans.factory.support.AbstractBeanFactory::doGetBean(String, Class<T>, Object[], boolean)
जो
Class.isAssignableFrom(anotherClass)
को एक महंगी कॉल है में एक गर्म स्थान खोजने के लिए एक प्रोफाइलर ऊपर निकाल दिया।
मैं जल्दी से एक छोटा सा प्रदर्शन परीक्षण बनाया है स्ट्रिंग नाम और प्रकार लुकअप के बीच गति अंतर पता लगाने के लिए एक काली है बार (मैं इस परीक्षण FAIW के लिए StaticApplicationContext
उपयोग कर रहा हूँ)!
इसकी जांच करते समय, मुझे SPR-6870 मिला जिसमें उच्च संख्या में वोट हैं लेकिन किसी कारण से संबोधित नहीं किया गया है। इससे मुझे an attempt to solve this problem का नेतृत्व हुआ जो स्थिति में काफी सुधार करता है लेकिन स्ट्रिंग द्वारा लुकअप के मुकाबले ~ 25 बार धीमा है! यह पता चला है कि यह प्रयास केवल समस्या का आधा हल करता है: यह ओ (एन) पुनरावृत्ति पर सहेजने के लिए बीन के नाम को कैश करता है लेकिन फिर भी प्रकार को सत्यापित करने के लिए isAssignableFrom
पर कॉल करना पड़ता है।
वर्णित समस्या न केवल मेरे परिदृश्य से संबंधित है बल्कि @Autowired
का उपयोग करने वाले बीन्स के लिए भी है और उन मामलों में कठिन महसूस किया जा सकता है जहां एक लूप के अंदर सेम बनाए जाते हैं।
समाधानों में से एक समाधान बीन फैक्ट्री विधियों में से एक को ओवरराइड करना होगा और यह-बीन-द-द-द-टाइप प्रकार के परिणामों को कैश करना होगा, लेकिन स्पष्ट रूप से यह वसंत में किया जाना चाहिए, न कि मेरे कोड में।
क्या कोई और इसी तरह की समस्या से पीड़ित है और इसे हल कर रहा है?
तो, आप टाइप करके ऑटोवायर करना चाहते हैं, लेकिन बिना किसी प्रकार की जांच किए? – GreyBeardedGeek
मैं महंगी प्रकार की जांच से बचने के लिए एक ही प्रकार के खिलाफ दूसरी कॉल चाहता हूं। या कम से कम मैं यह निर्दिष्ट करने की क्षमता चाहता हूं कि यह सक्षम या अक्षम है या नहीं। ऑब्जेक्ट सृजन ऐसी मूल बात है कि इस तरह के छोटे अनुकूलन एक बड़ा अंतर बना सकते हैं। – mindas