2013-08-13 8 views
7

मैं, इस प्रकार @Qualifier के लिए विशेषता के रूप में एक संपत्ति प्लेसहोल्डर उपयोग करने के लिए कोशिश कर रहा हूँ:स्प्रिंग: संपत्ति प्लेसहोल्डर साथ @Qualifier का उपयोग

@Autowired 
@Qualifier("${beanName}") 
private MyBean myBean; 

हालांकि, यह काम नहीं करता है, भले ही संपत्ति प्लेसहोल्डर उपलब्ध है एक स्ट्रिंग मान के रूप में:

@Value("${beanName}") 
private String beanName; 

यहां एक अच्छा कामकाज क्या होगा, बहुत बहुत धन्यवाद।

+0

एक अच्छा कामकाज आपके समग्र लक्ष्य पर निर्भर करता है। तो आप किस सामान्य समस्या को हल करना चाहते हैं? – Ralph

+0

मैं लोड होने पर संदर्भ में बीन के नाम को पारित करने के लिए एक स्प्रिंग 3 ProprtySource का उपयोग कर रहा हूं। यह कुंजी है: बीन नाम को एप्लिकेशन संदर्भ में एक तर्क के रूप में पारित किया जाना चाहिए। तर्क @Value एनोटेशन द्वारा पहचाना जाता है, लेकिन क्वालीफायर द्वारा नहीं। – user1052610

+3

लेकिन क्यों? यह आपके लक्ष्य के लिए बेहतर अनुकूल विकल्प हो सकता है। अगर मुझे अंधेरा अनुमान लगाना पड़ा तो ऐसा लगता है कि स्प्रिंग 3.1 की बीन प्रोफाइल आपके लिए लक्षित हो सकती है। –

उत्तर

1

तो यह मेरा जवाब है मैं एक टिप्पणी छोड़ नहीं कर सकते हैं: (? जो परिणाम आप लक्ष्य कर रहे हैं)

के रूप में एडम बी ने कहा कि हो सकता है आप परिणाम आप के लिए लक्ष्य कर रहे हैं प्राप्त करने के लिए वसंत प्रोफ़ाइल का उपयोग कर सकते हैं। एक नक्शा इस तरह अपने xml संदर्भ विन्यास में (नाम स्थान util वसंत का प्रयोग करके)

कॉन्फ़िगर:

एक और बात आप कर सकते है

<util:map id="mapId" key-type="java.lang.String" value-type="com.xxx.interface-or-superclass"> 
     <beans:entry key="${property.bean.name.1}" value-ref="bean1-defined-elsewehere"/> 
     <beans:entry key="${property.bean.name.2}" value-ref="bean2-defined-elsewehere"/> 
     <beans:entry key="${property.bean.name.3}" value-ref="bean3-defined-elsewehere"/> 
    </util:map> 

तो आप नामक एक सेम में इस नक्शे लोड कर सकते हैं जैसे। "Com.xxx.BeanSelector"

@Value("#{mapId}") 
private Map<String, com.xxx.interface-or-superclass> myMap; 

और इस तरह एक methos इस सेम में जोड़ें:

public interface-or-superclass getBean(String beanName){ 
    return myMap.get(beanName); 
} 

ठीक अब आप अपने अंतिम इस के समान वर्ग हो सकता है:

@Autowired 
private BeanSelector beanSelector; 

@Value("${property.name.the.bean.you.want.to.use}") 
private String beanName; 

private interface-or-superclass myBean; 

तो आप MyBean (शायद बाद में विधि के अंदर विधि के अंदर) अगर आप इंटरफ़ेस को कार्यान्वित कर रहे हैं, तो अंदरूनीकरण बीन)

इस तरह से:

myBean = beanSelector.getBean(beanName); 
// then check ifthe bean is not null or something like that 

ठीक है यह थोड़ा जटिल है और हो सकता है आप आप क्या हासिल करना चाहता हूँ के आधार पर एक अलग तरह से कार्य कर सकते हैं, लेकिन यह एक समाधान है।

0

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

9

मुझे बिल्कुल एक ही समस्या का सामना करना पड़ा। बस Resource

@Resource(name="${beanName}") 
private MyBean myBean; 
संबंधित मुद्दे