क्या स्प्रिंग कॉन्फ़िगरेशन फ़ाइल में एक तत्व पर id
विशेषता और name
विशेषता का उपयोग करने के बीच कोई अंतर है <bean>
?
क्या स्प्रिंग कॉन्फ़िगरेशन फ़ाइल में एक तत्व पर id
विशेषता और name
विशेषता का उपयोग करने के बीच कोई अंतर है <bean>
?
जवाबों:
से वसंत संदर्भ , 3.2.3.1 नामकरण बीन्स :
प्रत्येक बीन में एक या एक से अधिक आईडी होते हैं (जिन्हें पहचानकर्ता या नाम भी कहा जाता है; ये शब्द एक ही चीज़ को संदर्भित करते हैं)। ये आईडी अद्वितीय होनी चाहिए कंटेनर के अंदर बीन की मेजबानी की गई है। एक बीन में लगभग हमेशा केवल एक आईडी होगी, लेकिन अगर एक बीन में एक से अधिक आईडी हैं, तो अतिरिक्त रूप से आवश्यक रूप से उपनाम माना जा सकता है।
XML- आधारित कॉन्फ़िगरेशन मेटाडेटा का उपयोग करते समय, आप बीन आइडेंटिफ़ायर को निर्दिष्ट करने के लिए 'आईडी' या 'नाम' विशेषताओं का उपयोग करते हैं। 'आईडी' विशेषता आपको एक आईडी निर्दिष्ट करने की अनुमति देती है, और जैसा कि यह एक वास्तविक XML तत्व आईडी विशेषता है, XML पार्सर कुछ अतिरिक्त सत्यापन करने में सक्षम है जब अन्य तत्व आईडी का संदर्भ देते हैं; जैसे, यह बीन आईडी निर्दिष्ट करने का पसंदीदा तरीका है। हालाँकि, XML विनिर्देश उन वर्णों को सीमित करता है जो XML ID में कानूनी हैं। यह आमतौर पर एक बाधा नहीं है, लेकिन अगर आपको इन विशेष XML वर्णों में से किसी एक का उपयोग करने की आवश्यकता है, या बीन के लिए अन्य उपनामों को पेश करना चाहते हैं, तो आप अल्पविराम द्वारा अलग किए गए एक या एक से अधिक बीन आईडी को भी निर्दिष्ट कर सकते हैं ( ), अर्धविराम (;), या 'नाम' विशेषता में व्हाट्सएप।
तो मूल रूप से id
विशेषता XML आईडी विशेषता मानकों के अनुरूप होती name
है जबकि थोड़ी अधिक लचीली होती है। सामान्यतया, मैं name
विशेष रूप से बहुत अधिक उपयोग करता हूं । यह सिर्फ "स्प्रिंग-वाई" अधिक लगता है।
चूंकि वसंत 3.1 id
विशेषता एक है xsd:string
और विशेषता के समान वर्णों की अनुमति देता है name
।
A id
और a के बीच एकमात्र अंतर name
यह है कि name
इसमें अल्पविराम, अर्धविराम या व्हॉट्सएप द्वारा अलग किए गए कई उपनाम हो सकते हैं, जबकि id
एक एकल मान होना चाहिए।
स्प्रिंग 3.2 प्रलेखन से:
XML- आधारित कॉन्फ़िगरेशन मेटाडेटा में, आप बीन आइडेंटीफायर को निर्दिष्ट करने के लिए आईडी और / या नाम विशेषताओं का उपयोग करते हैं। आईडी विशेषता आपको एक आईडी निर्दिष्ट करने की अनुमति देती है। पारंपरिक रूप से ये नाम अल्फ़ान्यूमेरिक ('myBean', 'fooService', आदि) हैं, लेकिन विशेष वर्ण भी हो सकते हैं। यदि आप अन्य उपनामों को बीन से परिचित कराना चाहते हैं, तो आप उन्हें अल्पविराम (,), अर्धविराम (;), या श्वेत स्थान द्वारा अलग किए गए नाम विशेषता में भी निर्दिष्ट कर सकते हैं। एक ऐतिहासिक नोट के रूप में, स्प्रिंग 3.1 से पहले के संस्करणों में, आईडी विशेषता को एक xsd: ID के रूप में टाइप किया गया था, जो संभावित पात्रों को बाधित करता था। 3.1 के रूप में, यह अब xsd: string है। ध्यान दें कि बीन आईडी विशिष्टता अभी भी कंटेनर द्वारा लागू की जाती है, हालांकि एक्सएमएल पार्सर द्वारा नहीं।
या तो कोई काम करेगा। यह आपकी आवश्यकताओं पर निर्भर करता है:
यदि आपके बीन पहचानकर्ता में उदाहरण के लिए विशेष वर्ण (ओं /viewSummary.html
) हैं, तो इसे बीन के रूप में अनुमति नहीं दी जाएगी id
, क्योंकि यह एक वैध XML आईडी नहीं है। ऐसे मामलों में आप बीन को परिभाषित करना छोड़ सकते हैं id
और बीन की आपूर्ति कर सकते हैं name
।
यह name
विशेषता alias
आपके बीन के लिए es को परिभाषित करने में भी मदद करती है , क्योंकि यह किसी दिए गए बीन के लिए कई पहचानकर्ताओं को निर्दिष्ट करने की अनुमति देता है।
<B> टैग पर एक आईडी विशेषता और नाम विशेषता का उपयोग करने के बीच कोई अंतर है
कुछ मामूली अंतर मौजूद हैं, जैसे कि आईडी का उपयोग अपवाद को फेंक देगा यदि ठीक से संभाला न जाए।
मुझे नीचे सवाल का जवाब दो
क्या आईडी विशेषता का उपयोग करने और <bean> टैग पर नाम विशेषता का उपयोग करने के बीच कोई अंतर है ,
इसमें कोई फर्क नही है। जब <या बीन> टैग पर आईडी या नाम का उपयोग किया जाता है तो आप उसी प्रभाव का अनुभव करेंगे।
कैसे?
दोनों आईडी और नाम विशेषताएँ हमें एक बीन को पहचानकर्ता मूल्य प्रदान करने का साधन दे रही हैं (इस पल के लिए, लगता है कि आईडी का मतलब आईडी है, लेकिन सुरक्षित नहीं है)। दोनों मामलों में, यदि आप कॉल करते हैं तो आपको वही परिणाम दिखाई देगा applicationContext.getBean("bean-identifier");
।
@ बीन, जावा को <b> टैग के बराबर लें, आप एक आईडी विशेषता नहीं पाएंगे। आप अपना पहचानकर्ता मान केवल नाम विशेषता के माध्यम से @ बीन को दे सकते हैं।
मुझे इसे एक उदाहरण के माध्यम से समझाता हूं:
इस कॉन्फ़िगरेशन फ़ाइल को लें, चलो इसे स्प्रिंग 1.xml कहते हैं
<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
<bean id="foo" class="com.intertech.Foo"></bean>
<bean id="bar" class="com.intertech.Bar"></bean>
</beans>
वसंत के लिए फू वस्तु देता है Foo f = (Foo) context.getBean("foo");
। ऊपर दिए गए स्प्रिंग 1.xml के id="foo"
साथ बदलें name="foo"
, फिर भी आपको वही परिणाम दिखाई देगा।
अपने xml कॉन्फ़िगरेशन को परिभाषित करें, जैसे
<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
<bean id="fooIdentifier" class="com.intertech.Foo"></bean>
<bean name="fooIdentifier" class="com.intertech.Foo"></bean>
</beans>
आपको BeanDefinitionParsingException मिल जाएगी। यह कहेगा, इस तत्व में बीन नाम 'fooIdentifier' पहले से ही इस्तेमाल किया जाता है। वैसे, यह वही अपवाद है जिसे आप देखेंगे कि आपके पास नीचे
<bean name = "fooIdentifier" वर्ग = "com.intertech.Foo"> </ bean>
<bean name = "fooIdentifier" वर्ग = "com है। intertech.Foo "> </ b>>
यदि आप बीन टैग के लिए आईडी और नाम दोनों रखते हैं, तो बीन को 2 पहचानकर्ता कहते हैं। आप किसी भी पहचानकर्ता के साथ एक ही सेम प्राप्त कर सकते हैं। के रूप में कॉन्फ़िगर करें
<?xml version="1.0" encoding="UTF-8"?><br>
<beans ...>
<bean id="fooById" name="fooByName" class="com.intertech.Foo"></bean>
<bean id="bar" class="com.intertech.Bar"></bean>
</beans>
निम्नलिखित कोड सही है
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext(...);
Foo fooById = (Foo) context.getBean("fooById")// returns Foo object;
Foo fooByName = (Foo) context.getBean("fooByName")// returns Foo object;
System.out.println(fooById == fooByName) //true
क्या ApplicationContext xml में Id और नाम को परिभाषित करने में अंतर है? 3.1 (वसंत) के रूप में नहीं, आईडी को एक xsd: स्ट्रिंग प्रकार के रूप में भी परिभाषित किया गया है। इसका अर्थ है कि नाम को परिभाषित करने के लिए जो भी पात्र अनुमति देते हैं, उन्हें ईद में भी अनुमति दी जाती है। स्प्रिंग 3.1 से पहले यह संभव नहीं था।
ईद के समान होने पर नाम का उपयोग क्यों करें? यह कुछ स्थितियों के लिए उपयोगी है, जैसे कि एक घटक में प्रत्येक घटक को बीन नाम का उपयोग करके एक सामान्य निर्भरता का उल्लेख करने की अनुमति देना जो उस घटक के लिए विशिष्ट है।
For example, the configuration metadata for subsystem A may refer to a DataSource via the name subsystemA-dataSource. The configuration metadata for subsystem B may refer to a DataSource via the name subsystemB-dataSource. When composing the main application that uses both these subsystems the main application refers to the DataSource via the name myApp-dataSource. To have all three names refer to the same object you add to the MyApp configuration metadata the following
<bean id="myApp-dataSource" name="subsystemA-dataSource,subsystemB-dataSource" ..../>
Alternatively, You can have separate xml configuration files for each sub-system and then you can make use of
alias to define your own names.
<alias name="subsystemA-dataSource" alias="subsystemB-dataSource"/>
<alias name="subsystemA-dataSource" alias="myApp-dataSource" />
दोनों id
और name
स्प्रिंग आईओसी कंटेनर / ApplicationContecxt में बीन पहचानकर्ता हैं। id
विशेषता आप ठीक एक आईडी लेकिन का उपयोग कर निर्दिष्ट कर सकते हैं name
विशेषता आपको लगता है कि सेम के लिए अन्य नाम दे सकते हैं।
आप यहां स्प्रिंग डॉक की जांच कर सकते हैं।