2012-12-06 9 views
16

में इसका इस्तेमाल वसंत JavaConfig में, मैं संपत्ति स्रोत को परिभाषित करने और पर्यावरणएक्सएमएल में परिभाषित स्प्रिंग @PropertySource और पर्यावरण

@PropertySource("classpath:application.properties") 

@Inject private Environment environment; 

में इंजेक्षन मैं ऐसा कैसे कर सकते हैं कि एक्सएमएल में तो क्या होगा? मैं संदर्भ का उपयोग कर रहा हूं: संपत्ति-प्लेसहोल्डर, और जावाकोनिग क्लास @ImportResource पर xml आयात करने के लिए। लेकिन मैं गुण में परिभाषित संपत्ति environment.getProperty का उपयोग कर फ़ाइल प्राप्त नहीं कर सकता ("XX")

<context:property-placeholder location="classpath:application.properties" /> 

उत्तर

5

AFAIK, वहाँ शुद्ध एक्सएमएल द्वारा ऐसा करने का कोई तरीका नहीं है।

सबसे पहले, परीक्षण: वैसे भी, यहाँ एक छोटे से कोड मैंने किया था आज सुबह है

public class EnvironmentTests { 

    @Test 
    public void addPropertiesToEnvironmentTest() { 

     ApplicationContext context = new ClassPathXmlApplicationContext(
       "testContext.xml"); 

     Environment environment = context.getEnvironment(); 

     String world = environment.getProperty("hello"); 

     assertNotNull(world); 

     assertEquals("world", world); 

     System.out.println("Hello " + world); 

    } 

} 

फिर कक्षा:

public class PropertySourcesAdderBean implements InitializingBean, 
     ApplicationContextAware { 

    private Properties properties; 

    private ApplicationContext applicationContext; 

    public PropertySourcesAdderBean() { 

    } 

    public void afterPropertiesSet() throws Exception { 

    PropertiesPropertySource propertySource = new PropertiesPropertySource(
      "helloWorldProps", this.properties); 

    ConfigurableEnvironment environment = (ConfigurableEnvironment) this.applicationContext 
      .getEnvironment(); 

    environment.getPropertySources().addFirst(propertySource); 

    } 

    public Properties getProperties() { 
     return properties; 
    } 

    public void setProperties(Properties properties) { 
     this.properties = properties; 
    } 

    public void setApplicationContext(ApplicationContext applicationContext) 
      throws BeansException { 

     this.applicationContext = applicationContext; 

    } 

} 

और testContext.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans ...> 

    <util:properties id="props" location="classpath:props.properties" /> 

    <bean id="propertySources" class="org.mael.stackoverflow.testing.PropertySourcesAdderBean"> 
     <property name="properties" ref="props" /> 
    </bean> 


</beans> 

और props.properties फ़ाइल:

hello=world 

यह बहुत सरल है, बस एक ApplicationContextAware सेम का उपयोग करें और (Web)ApplicationContext से ConfigurableEnvironment मिलता है। फिर MutablePropertySources

+0

यह @Configure वर्ग के साथ काम नहीं करता है जब आप @ImportResource साथ एक्सएमएल को इंगित ("classpath:

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

तो अगर आप एक सेम में संपत्ति इंजेक्षन करना चाहते हैं बस इसे एक चर के रूप में उल्लेख : Properties.xml "), लेकिन जब आप इसे आवेदती के साथ लोड करते हैं तो काम करता है आपके उदाहरण में oncontext। – surajz

-1

यदि आपको केवल "application.properties" फ़ाइल की "xx" संपत्ति तक पहुंच है, तो आप इसे अपने xml फ़ाइल में निम्न बीन घोषित करके जावा कोड के बिना पूरा कर सकते हैं:

<bean id="myBean" class="foo.bar.MyClass"> 
     <property name="myProperty" value="${xx}"/> 
</bean> 
+1

प्रश्न पर्यावरण का उपयोग करके संपत्ति को पुनर्प्राप्त करने और संपत्ति प्लेसहोल्डर का उपयोग न करने के आसपास है। –

संबंधित मुद्दे