2011-09-09 6 views
5

मैं घटक स्कैनिंग और स्प्रिंग संस्करण 3.0.5.RELEASE में एक ही सेवा वर्ग के लिए एक्सएमएल विन्यास में एक अतिरिक्त सेम परिभाषा के उपयोग से संबंधित प्रश्न है।एक ही कक्षा के लिए घटक स्कैनिंग और एक्सएमएल बीन परिभाषा मिश्रण करते समय वसंत व्यवहार?

मैं एक वर्ग "MyService"

@Service("myService") 

साथ एनोटेट बनाया है और वहाँ है कि इस तरह दिखता है एक ही कक्षा के लिए एक सेम परिभाषा है:

<bean id="myService" class="....MyService" /> 

मैं एक

System.out.println("MyService has been instantiated"); 
डाल

संदेश MyService वर्ग के निर्माता में संदेश। यह संदेश कंसोल पर केवल एक बार पर प्रदर्शित होगा, जब मेरा एप्लिकेशन शुरू होता है। वसंत का पता लगाने के लिए पर्याप्त स्मार्ट लगता है, कि आईडी "myService" आईडी के साथ उस वर्ग का केवल एक उदाहरण हो सकता है।

लेकिन फिर भी जब मैं

@Service("myService2") 

में टिप्पणी बदलें और "MyService" करने के लिए एक्सएमएल सेम परिभाषा आईडी छोड़ देते हैं, वर्ग केवल एक बार instantiated कर दिया जाएगा।

मेरे दो प्रश्न हैं:

  1. कि हालांकि व्यवहार है कि मैं वर्तमान में चाहते है, यह एक वर्ग के लिए एक्सएमएल सेम परिभाषा और घटक स्कैनिंग अप मिश्रण करने संभव है, इसके साथ दो बार instantiated है करने के लिए विभिन्न बीन आईडी?

  2. किसी को भी पता है, क्या तंत्र वसंत में "पर्दे के पीछे" क्या है? वसंत कैसे तय करता है कि केवल एक बार कक्षा को तुरंत चालू करने के लिए कब? (शायद इसे एक ही कक्षा के लिए घटक स्कैनिंग और एक्सएमएल बीन परिभाषा को मिश्रण करने की अनुमति नहीं है?)

आपकी मदद के लिए बहुत बहुत धन्यवाद!

उत्तर

6

आपका प्रश्न 2. आसानी से उत्तर दिया जा सकता है। वसंत अपने दायरे के आधार पर सेम को तुरंत चालू करता है। डिफ़ॉल्ट दायरा "सिंगलटन" है, कोई फर्क नहीं पड़ता कि आप एक्सएमएल या एनोटेशन-आधारित कॉन्फ़िगरेशन का उपयोग करते हैं। यदि आप एक बीन को स्कोप = प्रोटोटाइप के रूप में घोषित करते हैं, तो जब भी कंटेनर से बीन के लिए पूछा जाता है तो यह तुरंत चालू हो जाएगा।

एनोटेशन के रूप में:

@Scope(StandardScopes.PROTOTYPE) 

एक्सएमएल में:

<bean .... scope="prototype"> 

आप एक सेम की ठीक दो उदाहरणों की जरूरत है, सबसे अच्छा एक्सएमएल में dfiferent नाम के साथ उनमें से दो की घोषणा करने के होगा मैं सोचूंगा।

अपने प्रश्न 1 के संबंध में, अगर यह एक वर्ग के दो उदाहरणों, एक एनोटेशन का उपयोग कर और एक XML का उपयोग घोषित करने के लिए संभव है मैं नहीं जानता। क्या आप वाकई क्लासपाथ स्कैनिंग वास्तव में आपके उदाहरण में काम करते हैं? एक्सएमएल बीन घोषणा छोड़ दें और फिर से प्रयास करें, क्या आपके पास बीन का उदाहरण है? यदि नहीं, तो आपको पहले क्लासपाथ स्कैनिंग को ठीक करना चाहिए क्योंकि ऐसा लगता है कि यह काम नहीं करता है।

वैसे भी, सबसे महत्वपूर्ण सवाल: आप ऐसा क्यों करना चाहते हैं? दोनों प्रकार के कॉन्फ़िगरेशन को मिश्रित करने से कुछ हद तक अस्पष्ट कोड बन जाएगा। कॉन्फ़िगरेशन प्रकारों को मिश्रित न करें, केवल एक के लिए जाएं, या हमें बताएं कि आपको उस बिल्ली की आवश्यकता क्यों है।

1

आप घटक स्कैन का उपयोग कर सकते हैं और साथ ही xml में बीन को परिभाषित कर सकते हैं। हालांकि यह बीन दायरे पर भी निर्भर करता है।

अधिक जानकारी के लिए यह post पढ़ें।

यदि घटक स्कैनिंग सक्षम है, तो वसंत एक बीन बनाने की कोशिश करेगा, भले ही उस वर्ग के एक बीन को वसंत कॉन्फ़िगर xml में पहले ही परिभाषित किया गया हो। हालांकि अगर वसंत कॉन्फ़िगरेशन फ़ाइल में परिभाषित बीन और ऑटो-सर्च बीन का एक ही नाम है, तो वसंत घटक स्कैनिंग करते समय एक नया बीन नहीं बनायेगा। यदि एक बीन में नो-Args कन्स्ट्रक्टर नहीं है, तो कम से कम एक कन्स्ट्रक्टर ऑटो-वायर्ड होना चाहिए। यदि कोई कन्स्ट्रक्टर ऑटो-वायर्ड नहीं है, तो वसंत डिफ़ॉल्ट नो-Args कन्स्ट्रक्टर का उपयोग करके ऑब्जेक्ट बनाने का प्रयास करेगा।

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