कैसे वसंत आवेदन में सिस्टम पर्यावरण चर को पढ़ने के लिए


116

एप्लिकेशन संदर्भ में सिस्टम पर्यावरण चर को कैसे पढ़ें?

मुझे कुछ चाहिए:

<util:properties id="dbProperties"
        location="classpath:config_DEV/db.properties" />

या

<util:properties id="dbProperties"
        location="classpath:config_QA/db.properties" />

एनवायरनमेंट पर निर्भर करता है।

क्या मैं अपने आवेदन के संदर्भ में ऐसा कुछ कर सकता हूं?

<util:properties id="dbProperties"
        location="classpath:config_${systemProperties.env}/db.properties" />

जहां सिस्टम वैल्यू सिस्टम वार्बल के आधार पर वास्तविक वैल सेट की जाती है

मैं स्प्रिंग 3.0 का उपयोग कर रहा हूं

जवाबों:



106

आप करीब हैं: ओ) स्प्रिंग 3.0 स्प्रिंग एक्सप्रेशन भाषा जोड़ता है । आप उपयोग कर सकते हैं

<util:properties id="dbProperties" 
    location="classpath:config_#{systemProperties['env']}/db.properties" />

के साथ संयुक्त java ... -Denv=QAअपनी समस्या को हल करना चाहिए।

नोट @ टिप्पणी द्वारा भी टिप्पणी:

सिस्टम वातावरण चर का उपयोग करने के लिए, जो कि एमो टिप्पणी के रूप में ओएस स्तर चर है, हम उस ईएल में "systemProperties" के बजाय "सिस्टमइन्वायरमेंट" का उपयोग कर सकते हैं। पसंद #{systemEnvironment['ENV_VARIABLE_NAME']}


जावा क्या है ... -दिनेव = क्यूए का मतलब है?
ताजे_देव

2
आप एक जावा सिस्टम गुण मान सेट करें। आप इस मान को कोड में पढ़ सकते हैं जैसेassert System.getProperty("env") == "QA";
amra

मुझे लगता है कि यह उत्तर गलत है, इससे सिस्टम एन्वायर्नमेंट वैरिएबल (यानी ओएस-लेवल वैरिएबल के साथ सेट exportआदि) पढ़ने की अनुमति नहीं है, यह केवल जावा सिस्टम प्रॉपर्टीज को पढ़ने की अनुमति देता है।
एमो

2
-ड्रॉप = ... कमांड लाइन में एक जावा प्रॉपर्टी सेट करता है। आप इस प्रॉपर्टी को पढ़ सकते हैं System.getProperty("prop")। यदि आप OS प्रॉपर्टी पढ़ना चाहते हैं तो उपयोग करें System.getenv("os-env-variable")Javadoc
amra

22
सिस्टम वातावरण चर का उपयोग करने के लिए, जो कि एमो टिप्पणी के रूप में ओएस स्तर चर है, हम उस ईएल में "systemProperties" के बजाय "सिस्टमइन्वायरमेंट" का उपयोग कर सकते हैं। की तरह #{systemEnvironment['ENV_VARIABLE_NAME']}
यूलिंग

51

आजकल आप डाल सकते हैं

@Autowired
private Environment environment;

आपके @Component, @Beanइत्यादि में, और फिर Environmentवर्ग के माध्यम से गुणों को एक्सेस करें :

environment.getProperty("myProp");

में एक एकल संपत्ति के लिए@Bean

@Value("${my.another.property:123}") // value after ':' is the default
Integer property;

एक और तरीका आसान @ConfigurationPropertiesबीन्स हैं:

@ConfigurationProperties(prefix="my.properties.prefix")
public class MyProperties {
  // value from my.properties.prefix.myProperty will be bound to this variable
  String myProperty;

  // and this will even throw a startup exception if the property is not found
  @javax.validation.constraints.NotNull
  String myRequiredProperty;

  //getters
}

@Component
public class MyOtherBean {
  @Autowired
  MyProperties myProperties;
}

नोट: बस एक नया वातावरण चर सेट करने के बाद ग्रहण को फिर से शुरू करना याद रखें


1
क्या Environmentइंटरफ़ेस के माध्यम से एन वी चर भी सुलभ हैं ?
निखिल साहू

@ निखिलशाहु हां, वे हैं। आप उन्हें उसी कुंजी के साथ एक्सेस करते हैं, जब java.lang.Systemआप OS टाइप करने के लिए उदाहरण देते हुए पूछते हैं env.getProperty("os.name")कि envआप अपना उदाहरण है org.springframework.core.env.Environment
उन्नीस

1
@Autowired private Environment environment;मेरे Componentपर्यावरण के लिए काम नहीं करता है हमेशा अशक्त
a_horse_with_no_name


8

अपनी बीन परिभाषा में, "searchSystemEnvironment" को शामिल करना सुनिश्चित करें और इसे "सही" पर सेट करें। और यदि आप किसी फ़ाइल के लिए पथ बनाने के लिए इसका उपयोग कर रहे हैं, तो इसे फ़ाइल के रूप में निर्दिष्ट करें: /// url।

इसलिए, उदाहरण के लिए, यदि आपके पास एक कॉन्फिगर फाइल है

/testapp/config/my.app.config.properties

फिर एक पर्यावरण चर सेट करें:

MY_ENV_VAR_PATH=/testapp/config

और आपका ऐप इस तरह सेम परिभाषा का उपयोग करके फ़ाइल को लोड कर सकता है:

जैसे

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="searchSystemEnvironment" value="true" />
    <property name="searchContextAttributes" value="true" />
    <property name="contextOverride" value="true" />
    <property name="ignoreResourceNotFound" value="true" />
    <property name="locations">
        <list>
            <value>file:///${MY_ENV_VAR_PATH}/my.app.config.properties</value>
        </list>
    </property>
</bean>

8

स्प्रिंग ईएल का उपयोग करके आप उदाहरण के लिए इस प्रकार लिख सकते हैं

<bean id="myBean" class="path.to.my.BeanClass">
    <!-- can be overridden with -Dtest.target.host=http://whatever.com -->
    <constructor-arg value="#{systemProperties['test.target.host'] ?: 'http://localhost:18888'}"/>
</bean>

5

मेरे उपयोग के मामले के लिए, मुझे बस सिस्टम गुणों तक पहुँचने की आवश्यकता थी, लेकिन वे अपरिभाषित होने पर डिफ़ॉल्ट मान प्रदान करते हैं।

इसे आपको इसी तरह करना होगा:

<bean id="propertyPlaceholderConfigurer"   
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="searchSystemEnvironment" value="true" />
</bean>  
<bean id="myBean" class="path.to.my.BeanClass">
    <!-- can be overridden with -Dtest.target.host=http://whatever.com -->
    <constructor-arg value="${test.target.host:http://localhost:18888}"/>
</bean>

4

प्रॉपर्टी प्लेस होल्डर को इस प्रकार घोषित करें

<bean id="propertyPlaceholderConfigurer"   
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="locations">
        <list>
            <value>file:///path.to.your.app.config.properties</value>
        </list>
    </property>
</bean>

फिर आपको यह बताने की इच्छा है कि आप System.property("java.io.tmpdir")अपने टॉम्पट बीन या किसी बीन के लिए पढ़ना चाहते हैं तो अपनी प्रॉपर्टीज़ फ़ाइल में निम्नलिखित जोड़ें:

tomcat.tmp.dir=${java.io.tmpdir}

1

इसे आपको इसी तरह करना होगा:

<bean id="systemPrereqs" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" scope="prototype">
             <property name="targetObject" value="#{@systemProperties}" />
             <property name="targetMethod" value="putAll" />
             <property name="arguments">
                   <util:properties>
                       <prop key="deployment.env">dev</prop>
                   </util:properties>
            </property>
    </bean>

लेकिन याद रखें कि वसंत पहले लोड हो जाता है और फिर वह इस बीन को लोड करेगा MethodInvokingFactoryBean। इसलिए यदि आप अपने परीक्षण मामले के लिए इसका उपयोग करने की कोशिश कर रहे हैं, तो सुनिश्चित करें कि आप निर्भरता का उपयोग करते हैं। इस मामले में उदाहरण के लिए

यदि आप अपने मुख्य वर्ग के लिए इसका उपयोग बेहतर कर रहे हैं तो इस संपत्ति को अपने pom.xml के रूप में सेट करें

<systemProperty>
    <name>deployment.env</name>
    <value>dev</value>
</systemProperty>

1

आप किसी प्रॉपर्टी फ़ाइल में अपनी चर विशेषताओं का उल्लेख कर सकते हैं और पर्यावरण विशिष्ट संपत्ति फ़ाइलों को परिभाषित कर सकते हैं, जैसे कि local.properties, production.propertied आदि।

अब पर्यावरण के आधार पर, इनमें से एक प्रॉपर्टी फाइल को एक ऐसे श्रोता में पढ़ा जा सकता है, जिसे सर्वलेटकोटेक्स्टलेनर की तरह, स्टार्टअप में आमंत्रित किया गया है।

संपत्ति फ़ाइल में विभिन्न कुंजियों के लिए पर्यावरण विशिष्ट मान शामिल होंगे।

नमूना "लोकल.प्रोपेटीज़"

db.logsDataSource.url=jdbc:mysql://localhost:3306/logs
db.logsDataSource.username=root
db.logsDataSource.password=root

db.dataSource.url=jdbc:mysql://localhost:3306/main
db.dataSource.username=root
db.dataSource.password=root

नमूना "उत्पादन.प्रक्रिया"

db.logsDataSource.url=jdbc:mariadb://111.111.111.111:3306/logs
db.logsDataSource.username=admin
db.logsDataSource.password=xyzqer

db.dataSource.url=jdbc:mysql://111.111.111.111:3306/carsinfo
db.dataSource.username=admin
db.dataSource.password=safasf@mn

इन गुणों की फ़ाइल का उपयोग करने के लिए, आप नीचे बताए अनुसार REsource का उपयोग कर सकते हैं

        PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
        ResourceLoader resourceLoader = new DefaultResourceLoader();

        Resource resource = resourceLoader.getResource("classpath:"+System.getenv("SERVER_TYPE")+"DB.properties");
        configurer.setLocation(resource);
        configurer.postProcessBeanFactory(beanFactory);

SERVER_TYPE को पर्यावरणीय चर के रूप में परिभाषित किया जा सकता है, जो स्थानीय और उत्पादन पर्यावरण के लिए उचित मूल्यों के साथ है।

इन परिवर्तनों के साथ appplicationContext.xml में निम्नलिखित परिवर्तन होंगे

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
 <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  <property name="url" value="${db.dataSource.url}" />
  <property name="username" value="${db.dataSource.username}" />
  <property name="password" value="${db.dataSource.password}" />

उम्मीद है की यह मदद करेगा ।


1

@Yiling के लिए धन्यवाद। यह एक संकेत था।

<bean id="propertyConfigurer"
        class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">

    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="searchSystemEnvironment" value="true" />
    <property name="locations">
        <list>
            <value>file:#{systemEnvironment['FILE_PATH']}/first.properties</value>
            <value>file:#{systemEnvironment['FILE_PATH']}/second.properties</value>
            <value>file:#{systemEnvironment['FILE_PATH']}/third.properties</value>
        </list>
    </property>
</bean>

इसके बाद, आपके पास 'FILE_PATH' नाम का एक पर्यावरण चर होना चाहिए। सुनिश्चित करें कि आपने उस पर्यावरण चर को बनाने के बाद अपने टर्मिनल / आईडीई को पुनः आरंभ किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.