2009-08-12 13 views
5

मैं एक वसंत सेम कि इतने की तरह, अन्य सेम की एक सूची है बनाया है:स्प्रिंग एक्सएमएल भीतरी सेम सवाल

<bean name="InventoryManager" class="InvManager"> 
    <property name="slots"> 
    <bean class="HeadSlot" /> 
    <bean class="ShoulderSlot" /> 
    <!-- ... --> 
    </property> 
</bean> 

समस्या है, हालांकि, कि कहीं मैं करने के लिए एक और कक्षा में एक @Autowired एनोटेशन का इस्तेमाल किया है है एक निश्चित इंटरफ़ेस को लागू सभी सेम है कि इन भीतरी सेम से कुछ को लागू है, इसलिए की तरह की एक सूची हड़पने:

@Autowired 
public void registerInventoryHandlers(List<InvSlot> slots) { 
    //... do some setup stuff with beans that implement the InvSlot interface. 
} 

समस्या यहाँ है कि जाहिरा तौर पर "आंतरिक सेम" एक्सएमएल में परिभाषित @Autowired सूची का हिस्सा नहीं हैं। हालांकि, इन सभी स्लॉट सेम नामों को देकर और फिर उन्हें एक्सएमएल से संदर्भित करना अनावश्यक और बदसूरत लगता है।

क्या कोई अन्य बीन के अंदर एक बीन को परिभाषित करने का कोई तरीका है, लेकिन "आंतरिक" बीन नहीं है? या इस डिजाइन को संभालने का एक बेहतर तरीका है?

उत्तर

5

बीन्स परिभाषा के द्वारा अन्य सेम कर रहे हैं, अंदर परिभाषित, "आंतरिक" सेम हो जाता है। दस्तावेज़ कहते हैं:

आंतरिक बीन्स हमेशा अज्ञात होते हैं और वे हमेशा प्रोटोटाइप के रूप में स्कॉप्ड होते हैं। कृपया यह भी ध्यान दें कि बीन संलग्न करने के अलावा अन्य बीन्स को सहयोग करने के लिए आंतरिक बीन्स इंजेक्ट करने के लिए संभव नहीं है।

सामान कि खराब बाहर सोचा गया था, irrelevent या पूरी तरह से गलत को दूर करने के संपादित

मेरा सुझाव है कि बजाय InvSlot सेम की सूची autowiring से, आप अपने आप को InvManager सेम के साथ बजाय autowire। InvManager परिभाषा के अंदर आंतरिक बीन परिभाषाओं की अपनी सूची रखते हुए आप बीन्स की सूची के लिए InvManager से पूछ सकते हैं।

+0

आह, इसके विपरीत! @Autowired कुछ आश्चर्यजनक, कम ज्ञात उपयोग है। स्प्रिंग के दस्तावेज़ीकरण को उद्धृत करने के लिए: "किसी भी क्षेत्र या विधि में एनोटेशन जोड़कर एप्लिकेशनकॉन्टेक्स्ट से किसी विशेष प्रकार के सभी बीन्स प्रदान करना भी संभव है जो उस प्रकार की सरणी की अपेक्षा करता है" –

+0

खूनी नरक, तो ऐसा होता है। मैं आपको धन्यवाद देता हूं, आपने मुझे एक नई बात सिखाई है :) – skaffman

+0

मैंने इसे "खुद को पंजीकृत करने की आवश्यकता नहीं है" घटना कतार के रूप में इस्तेमाल करने की कोशिश की और खुद को खूनी चालाक माना। लेकिन फिर मैं कीड़े के इस विशेष कर में भाग गया। –

0

मुझे पता चला है कि @ कॉम्पोनेंट का उपयोग बहुत अच्छी तरह से काम करता है।

@Component class InvManager { 
    ... 
    @Autowired 
    public void registerInventoryHandlers(List<InvSlot> slots) { ... } 
} 

और

@Component class HeadSlot implements InvSlot { ... } 

और

@Component class ShoulderSlot implements InvSlot { ... } 

आपका विन्यास

<context:component-scan base-package="com.foo.bar"/> 
संबंधित मुद्दे