2012-05-30 10 views
27

तो मेरे पास है:मैं एप्लिकेशन कॉन्टेक्स्ट ऑब्जेक्ट से संपत्ति मान कैसे प्राप्त करूं? (एक एनोटेशन का उपयोग नहीं)

@Autowired private ApplicationContext ctx; 

मैं getBean तरीकों में से एक का उपयोग करके सेम और संसाधनों मिल सकती है। हालांकि, मैं यह नहीं समझ सकता कि संपत्ति मूल्य कैसे प्राप्त करें।

जाहिर है, मैं एक नया सेम जो की तरह एक @value संपत्ति है बना सकते हैं:

private @Value("${someProp}") String somePropValue; 

क्या विधि मैं ApplicationContext वस्तु पर फोन एक सेम autowiring बिना कि मूल्य प्राप्त करने के हैं?

मैं आमतौर पर @value उपयोग करें, लेकिन वहाँ एक स्थिति है जहाँ स्पेल अभिव्यक्ति गतिशील होने की जरूरत है, इसलिए मैं सिर्फ एक एनोटेशन का उपयोग नहीं कर सकते हैं।

+0

(YourBeanType) ctx.getBean ("BeanId"); –

उत्तर

11

यह मानते हुए कि ${someProp} संपत्ति एक PropertyPlaceHolderConfigurer से आता है, कि चीजें कठिन बना देता है। PropertyPlaceholderConfigurer एक BeanFactoryPostProcessor है और इस तरह केवल कंटेनर स्टार्टअप समय पर उपलब्ध है। तो संपत्ति रनटाइम पर एक बीन के लिए उपलब्ध नहीं हैं।

एक समाधान एक मूल्य धारक बीन बनाने के लिए होगा जिससे आप अपनी संपत्ति/संपत्तियों के साथ आरंभ कर सकें।

@Component 
public class PropertyHolder{ 

    @Value("${props.foo}") private String foo; 
    @Value("${props.bar}") private String bar; 

    // + getter methods 
} 

अब इस PropertyHolder भी आप गुण की जरूरत है इंजेक्षन और गेटर तरीकों

+0

एक उदाहरण यहां बहुत उपयोगी होगा। – Webnet

+0

@ वेबनेट ठीक है, एक छोटा सा उदाहरण जोड़ा गया –

+0

क्या यह आवश्यक नहीं है कि 'PropertyHolder' एक प्रबंधित बीन है? मुझे लगता है कि @HappyEngineer एक समाधान की तलाश में था जो एक प्रबंधित बीन नहीं है (जैसा कि मैं हूं)। – Webnet

33

मामले में जहां स्पेल अभिव्यक्ति गतिशील होने की जरूरत है में के माध्यम से गुण का उपयोग, मैन्युअल रूप से संपत्ति के मूल्य मिलता है:

somePropValue = ctx.getEnvironment().getProperty("someProp"); 
+2

क्रम में एक बहुत बुरा विचार पर्यावरण का उपयोग करना (के रूप में केवल शुरूआत करने के लिए apposed) आमतौर पर है के रूप में यह JNDI और अन्य स्थानों की तलाश में चला जाता है के माध्यम से मूल्य, जो महंगा है। – kaqqao

8

आप वसंत पर अटक रहे हैं, तो पूर्व 3.1, तो आप उपयोग कर सकते हैं

somePropValue = ctx.getBeanFactory().resolveEmbeddedValue("${someProp}"); 
संबंधित मुद्दे