स्प्रिंग कॉन्फ़िगरेशन फ़ाइल में बीन आईडी और नाम का उपयोग करने के बीच अंतर


205

क्या स्प्रिंग कॉन्फ़िगरेशन फ़ाइल में एक तत्व पर idविशेषता और nameविशेषता का उपयोग करने के बीच कोई अंतर है <bean>?


8
यह सीधा और कठिन सवालों का जवाब देना बहुत ही सरल और व्यापक है। महान। धन्यवाद!
पीटर पेराह

जवाबों:


129

से वसंत संदर्भ , 3.2.3.1 नामकरण बीन्स :

प्रत्येक बीन में एक या एक से अधिक आईडी होते हैं (जिन्हें पहचानकर्ता या नाम भी कहा जाता है; ये शब्द एक ही चीज़ को संदर्भित करते हैं)। ये आईडी अद्वितीय होनी चाहिए कंटेनर के अंदर बीन की मेजबानी की गई है। एक बीन में लगभग हमेशा केवल एक आईडी होगी, लेकिन अगर एक बीन में एक से अधिक आईडी हैं, तो अतिरिक्त रूप से आवश्यक रूप से उपनाम माना जा सकता है।

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

तो मूल रूप से idविशेषता XML आईडी विशेषता मानकों के अनुरूप होती nameहै जबकि थोड़ी अधिक लचीली होती है। सामान्यतया, मैं nameविशेष रूप से बहुत अधिक उपयोग करता हूं । यह सिर्फ "स्प्रिंग-वाई" अधिक लगता है।


46
आप "नाम" विशेषता का उपयोग करना पसंद करते हैं, भले ही आपने "आईडी" विशेषता का उपयोग करते हुए सिफारिश की है कि वसंत संदर्भ? यहां तक ​​कि अगर आप "नाम" के साथ रहना पसंद करते हैं, तो आप इसे और अधिक "स्प्रिंग-वाई" नहीं कह सकते हैं यदि स्प्रिंग संदर्भ अन्यथा सुझाव देता है :) यह
नाइटपिकि है

77

चूंकि वसंत 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 है। ध्यान दें कि बीन आईडी विशिष्टता अभी भी कंटेनर द्वारा लागू की जाती है, हालांकि एक्सएमएल पार्सर द्वारा नहीं।


48

या तो कोई काम करेगा। यह आपकी आवश्यकताओं पर निर्भर करता है:
यदि आपके बीन पहचानकर्ता में उदाहरण के लिए विशेष वर्ण (ओं /viewSummary.html) हैं, तो इसे बीन के रूप में अनुमति नहीं दी जाएगी id, क्योंकि यह एक वैध XML आईडी नहीं है। ऐसे मामलों में आप बीन को परिभाषित करना छोड़ सकते हैं idऔर बीन की आपूर्ति कर सकते हैं name
यह nameविशेषता aliasआपके बीन के लिए es को परिभाषित करने में भी मदद करती है , क्योंकि यह किसी दिए गए बीन के लिए कई पहचानकर्ताओं को निर्दिष्ट करने की अनुमति देता है।


4
प्लस एक यह अपने शब्दों में कहने के लिए और एक उदाहरण देने के लिए कि विशेष वर्णों की आवश्यकता क्यों हो सकती है।
माइकल पिफेल

धन्यवाद। इसकी प्रशंसा करना।
pugmarx

3

<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

1

क्या 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" />

0

दोनों idऔर nameस्प्रिंग आईओसी कंटेनर / ApplicationContecxt में बीन पहचानकर्ता हैं। idविशेषता आप ठीक एक आईडी लेकिन का उपयोग कर निर्दिष्ट कर सकते हैं nameविशेषता आपको लगता है कि सेम के लिए अन्य नाम दे सकते हैं।

आप यहां स्प्रिंग डॉक की जांच कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.