2010-01-18 14 views
8

इंजेक्शन वाले ऑब्जेक्ट्स के उदाहरण बनाते हैं, वसंत DI करता है और ऑब्जेक्ट बनाता है ताकि आपके प्रोग्राम को ऑब्जेक्ट्स बनाने की चिंता न हो। लेकिन यहां सवाल यह है कि इंजेक्शन ऑब्जेक्ट का एक उदाहरण बनाया गया है। क्या यह मुख्य कार्यक्रम उदाहरण का उपयोग करता है या उस समय मुख्य कार्यक्रम का एक उदाहरण बनाया जाता है।वसंत

उत्तर

12

संदर्भ में सभी बीन्स तत्काल, इंजेक्शन और संदर्भ शुरू होने पर प्रारंभिक होते हैं। जब तक पहली बीन संदर्भ से पुनर्प्राप्त कर लिया गया है, तब तक सभी सेम उपयोग के लिए तैयार हैं।

वहाँ दो चीजें हैं जो एक सेम को रोका जा सकता संदर्भ में प्रारंभ किया जा रहा है शुरू:

  • एक सेम है सेम, एक different scope (जैसे prototype, request या session) के साथ विन्यस्त scope="xyz" विशेषता
  • का उपयोग कर
  • एक बीन को lazy-init="true" के साथ चिह्नित किया गया है, इस स्थिति में इसे तत्काल तत्काल पूछा जाएगा, या यदि इसे किसी अन्य बीन की निर्भरता के रूप में आवश्यक हो।
+3

आप सही हैं! एक गैर-सिंगलटन बीन तुरंत नहीं बनाया जाएगा। +1 – nanda

+0

धन्यवाद skaffman, जो मेरे संदेह को स्पष्ट करता है। तो यह तय करने के लिए प्रोग्रामर तक है कि एक बीन को आलसी शुरू करने या पहले शुरू करने की आवश्यकता है या नहीं। यह बहुत ही व्यक्तिपरक हो सकता है, लेकिन क्या आप मुझे इस तरह की स्थितियों में आने वाले किसी भी सर्वोत्तम अभ्यास के बारे में बता सकते हैं। –

+0

यह पूरी तरह से व्यक्तिपरक है, हां, लेकिन फिर बाकी सॉफ्टवेयर निर्माण भी है। यह कोई अलग नहीं है। लेकिन आपकी डिफ़ॉल्ट स्थिति गैर आलसी, और डिफ़ॉल्ट दायरा होना चाहिए। यदि आपके पास बहुत अच्छा कारण है तो केवल एक बीन बनाएं। – skaffman

2

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-lazy-init

डिफ़ॉल्ट रूप से, ApplicationContext कार्यान्वयन बेसब्री से बना सकते हैं और प्रारंभ की प्रक्रिया के हिस्से के रूप में सभी सिंगलटन सेम कॉन्फ़िगर करें। आम तौर पर, यह पूर्व-त्वरण वांछनीय है, क्योंकि कॉन्फ़िगरेशन या आस-पास के वातावरण में त्रुटियां तुरंत खोजी जाती हैं, क्योंकि घंटों या यहां तक ​​कि दिनों के विपरीत भी। जब यह व्यवहार वांछनीय नहीं है, तो आप बीन परिभाषा को आलसी-प्रारंभिक के रूप में चिह्नित करके सिंगलटन बीन के पूर्व-त्वरण को रोक सकते हैं। एक आलसी-प्रारंभिक बीन आईओसी कंटेनर को बीन इंस्टेंस बनाने के लिए कहता है जब स्टार्टअप के बजाय पहले अनुरोध किया जाता है।

4

एक टिप्पणी में, ओपी लिखते हैं:

तो यह एक सेम lazily प्रारंभ या अग्रिम प्रारंभ किए जाने की जरूरत है कि क्या तय करने के लिए प्रोग्रामर पर निर्भर है। यह बहुत ही व्यक्तिपरक हो सकता है, लेकिन क्या आप मुझे इस तरह की स्थितियों में आने वाले किसी भी सर्वोत्तम अभ्यास के बारे में बता सकते हैं।

हाँ, यह प्रोग्रामर (या प्रणाली एकीकरण) तय करने के लिए पर निर्भर है।

निर्णय लेने के लिए वास्तव में कोई भी "सर्वोत्तम अभ्यास" नियम नहीं हैं। इसके बारे में इस तरह सोचें:

  • आप एक सेम के रूप में lazily प्रारंभ जब यह हमेशा instantiated करने की आवश्यकता होगी घोषित हैं, तो आप संभवतः स्टार्टअप प्रक्रिया धीमी कर देगा।

  • यदि आप हमेशा से जरूरी नहीं होने पर एक बीन घोषित करते हैं, तो आप स्टार्टअप प्रक्रिया को धीमा कर देंगे, और संभवतः अधिक मेमोरी का उपयोग करेंगे। सबसे बुरे मामले में, अनावश्यक बीन बनाने से स्टार्टअप असफल हो सकता है।

संक्षेप में, आपको अपने आवेदन को समझने की आवश्यकता है।

+0

+1 सलाह की सराहना करते हैं "संक्षेप में, आपको अपने आवेदन को समझने की आवश्यकता है।" – asgs