2008-11-26 15 views
24

मैं कुछ स्प्रिंग कोड की समीक्षा कर रहा हूं, और मुझे कुछ बीन डीफ़ दिखाई देता है जिनके पास आईडी या नाम नहीं है। जिस व्यक्ति ने इसे किया वह पूछने के लिए नहीं है। आवेदन ठीक काम कर रहा है। मुझे परिचित नहीं है कि इसका क्या अर्थ है। किसी को भी पता है कि इसका मतलब विशेष रूप से कुछ भी है?कोई आईडी या नाम के साथ वसंत बीन

+0

संदर्भ परिभाषा पोस्ट करने पर विचार करें - संदर्भ में परिभाषा को देखे बिना, ठोस जवाब देना मुश्किल है। –

+0

यदि कोई नाम स्पष्ट रूप से प्रदान नहीं किया जाता है, तो कंटेनर उस बीन के लिए एक अद्वितीय नाम उत्पन्न करेगा। – lolotron

+4

डिफॉल्ट रूप से, बीन की आईडी क्लास नाम के ऊंट-आवरण द्वारा उत्पन्न की जाएगी। – lolotron

उत्तर

20

कुछ बीन्स को संदर्भ फ़ाइल या प्रोग्रामेटिक रूप से अन्य बीन्स द्वारा एक्सेस करने की आवश्यकता नहीं है। तो जैसा कि जैकब एम द्वारा उल्लिखित है, उन्हें किसी आईडी या नाम की आवश्यकता नहीं है क्योंकि उनका संदर्भ नहीं दिया गया है।

ऐसा उदाहरण PropertyPlaceholderConfigurer होगा, जो एक प्रॉपर्टी फ़ाइल पढ़ता है, फिर संदर्भ परिभाषा में रनटाइम संपत्ति प्रतिस्थापन की अनुमति देता है।

उदाहरण परिभाषा

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="myapp.properties" /> 
</bean> 

JavaDoc इस वस्तु पर आगे प्रलेखन प्रदान करता है हो सकता है, लेकिन आगे की फ़ाइल में पर तुम सिर्फ मानक टेम्पलेट प्लेसहोल्डर $ की जगह {उपयोग करके अपनी फ़ाइल से गुण संदर्भित कर सकते हैं .. ।}।

7

एक संभावना यह है कि आप एक बीन को जगह में परिभाषित कर सकते हैं, और इसलिए आपको किसी आईडी से इसकी आवश्यकता नहीं है क्योंकि आपको इसे कहीं और से संदर्भित करने की आवश्यकता नहीं है।

<bean id="foo" class="Foo"> 
    <property name="bar"> 
     <bean class="Bar"> 
    </property> 
</bean> 

बार सेम क्योंकि यह केवल यह है कि एक गुण सेट करने के लिए प्रयोग किया जाता है एक नाम की जरूरत नहीं है: मैं एक फू उद्देश्य यह है कि एक बार संपत्ति लेता है कहो।

2

आईडी और नाम विशेषताएँ वैकल्पिक हैं और इन्हें अन्य परिभाषाओं से बीन परिभाषा का संदर्भ देने के लिए उपयोग किया जाता है। अधिक जानकारी के लिए official Spring documentation पर देखें।

5

ऑटो-वायरिंग की संभावना की जांच करें। एक अन्य बीन टाइप किए गए ऑटोवायर संपत्ति को सेट करके अज्ञात बीन का संदर्भ दे सकता है।

यह सिर्फ एक अनुमान है। एक ठोस उदाहरण के बिना, मैं और नहीं कह सकता।

1

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

1

ऊपर वर्णित कुछ लोगों के रूप में, सभी बीन-हथियार नाम/आईडी पर आधारित नहीं है; इसमें से कुछ प्रकार पर आधारित है। उदाहरण के लिए, वहाँ एक तरीका है

BeanFactoryUtils.beansOfTypeIncludingAncestors (...)

है कि कुछ दिया प्रकार के सभी सेम पकड़ लेता है। इसका उपयोग उदाहरण के लिए बीन्स को खोजने के लिए स्प्रिंग वेब एमवीसी डिस्पैचर सर्वलेट (कई अन्य स्थानों के बीच) द्वारा किया जाता है, जैसे हैंडलर मैपिंग्स, हैंडलरएडाप्टर, हैंडलरएक्सप्शन रिसेल्वर और बहुत आगे। उन मामलों के साथ तुलना करें जहां बीन के पास एक विशिष्ट प्रसिद्ध नाम/आईडी होना चाहिए, जैसे लोकेल रेसॉल्वर (आईडी "लोकेल रिसेल्वर" होना चाहिए या यह नहीं मिलेगा) और थीमरोलॉल्वर (आईडी "थीम रेसोलवर" होनी चाहिए या यह नहीं मिलेगा)।

1

बीन्स नाम और आईडी के बिना परिभाषित, एक उत्पन्न ID (पूर्ण पैकेज नाम और वर्ग के नाम) के साथ पहुँचा जा सकता है उदाहरण के लिए:

सेम

<bean class="pl.finsys.initOrder.TestBeanImpl"> 

के रूप में परिभाषित किया जा सकता

द्वारा
TestBean bean = (TestBean) ctx.getBean("pl.finsys.initOrder.TestBeanImpl"); 
1
बीन आईडी के बिना

// बीन cfg फ़ाइल

<bean class="com.ds.DemoBean"> <property name="msg" value="Hello"/> </bean>

// हम उपयोग कर सकते हैं

वस्तु obj = factory.getBean ("com.ds.DemoBe

0

अपने जावा बीन Id..If प्रदान करने के लिए हम बीन आईडी प्रदान नहीं कर रहे एक अनिवार्य नहीं, हमारे कंटेनर डिफ़ॉल्ट बीन आईडी प्रदान करता है। डीफॉल्ट बीन आईडी "(पैकेज नाम) जैसा दिखता है। (बीन क्लास नाम) # एन" जहां एन = 0,1,2, ...... आदि।

0

ऐसा लगता है कि अनामित और नामित बीन व्यवहार के बीच एक सूक्ष्म अंतर है। यदि आपके पास एक XML कॉन्फ़िगरेशन फ़ाइल दो बार आयात की गई है, तो प्रत्येक नामित बीन केवल एक बार बनाया जाएगा, लेकिन एक अनाम बीन इसकी परिभाषा शामिल होने के साथ कई बार बनाई जाएगी। इस तरह के बीन को टाइप करने की कोशिश करते समय, यह इस तरह की त्रुटियों की ओर जाता है:

No qualifying bean of type [your.class.Name] is defined: expected single matching bean but found 4 
संबंधित मुद्दे