2010-10-19 51 views
84

如何在應用程序上下文中讀取系統環境變量?如何在Spring應用程序上下文中讀取系統環境變量

我想是這樣的:這取決於environement

<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" /> 

,其中實際VAL是基於系統環境變量

我使用Spring 3.0

回答

23

是的,你可以做<property name="defaultLocale" value="#{ systemProperties['user.region']}"/>例如設定。

變量系統屬性是預定義的,請參閱6.4.1 XML based configuration

85

您正在關注:o) Spring 3.0增加了Spring Expression Language。 您可以使用

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

java ... -Denv=QA結合應該解決您的問題。

還要注意通過@yiling評論:

爲了訪問系統環境變量,即OS級別 變量AMOE評論,我們可以簡單地用「systemEnvironment」 而不是「systemProperties」 EL。像 #{systemEnvironment['ENV_VARIABLE_NAME']}

+0

什麼是java ... -Denv = QA的含義? – 2012-01-18 14:47:50

+2

您設置了一個java系統屬性值。你可以像'assert System.getProperty(「env」)==「QA」那樣在代碼中讀取這個值;' – amra 2012-01-20 17:14:08

+0

我認爲這個答案是不正確的,這不允許讀取系統環境變量(即OS級別的變量'export'等),它只允許讀取Java系統屬性。 – amoe 2013-11-15 13:24:48

8

在您的bean定義中,請確保包含「searchSystemEnvironment」並將其設置爲「true」。如果您使用它來構建文件路徑,請將其指定爲file:/// url。

因此,舉例來說,如果你有位於

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

一個配置文件,然後設置環境變量,像這樣:

MY_ENV_VAR_PATH=/testapp/config 

和您的應用程序可以加載該文件使用一個bean定義,就像這個:

eg

<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> 
+2

現在我該如何讀取java中加載的屬性? – Bhuvan 2013-05-17 06:05:36

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> 
6

使用Spring EL可以eis example寫如下

<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> 
+0

關於默認值的好提示 – 2017-08-16 17:32:33

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> 

但要記住spring首先被加載,然後它將加載這個Bean MethodInvokingFactoryBean。所以如果你正在嘗試使用這個測試用例,那麼請確保你使用depends-on。對於例如在這種情況下

如果你正在使用它的主類中更好使用你的pom.xml作爲

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

現在來設置該屬性可以把

@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; 
} 

注:請記住設置一個新的環境變量

+0

env變量是否也可以通過'Environment'接口訪問? – 2016-12-11 18:06:16

+0

@NikhilSahu是的,他們是。你可以像查詢'java.lang.System'一樣使用相同的鍵來訪問它們,例如,如果要獲得操作系統類型,你可以使用'env.getProperty(「os.name」)'假設'env'是'org的實例.springframework.core.env.Environment'。 – Ninetou 2017-06-27 18:15:36

-2

要獲得系統變量,下面的代碼SimPy中使用的值之後重新啓動Eclipse:

System.getenv("property-name"); 
1

您可以在屬性文件中提到你的變量屬性和定義特定於環境的屬性文件,如local.properties,production.propertied等。

現在基於環境,這些屬性文件中的一個可以在啓動時調用的偵聽器中讀取,如ServletContextListener。

屬性文件將包含各種鍵的環境特定值。

樣本 「local.propeties」

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 
[email protected] 

對於使用這些屬性文件,你可以利用的資源爲下面提到

 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可以被定義爲本地和生產環境的相應值的環境變量。

通過這些更改,應用程序Context.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}" /> 

希望這會有所幫助。

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豆或豆然後添加在你的屬性如下文件:

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

感謝@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'的環境變量。確保在創建該環境變量後重新啓動機器。

相關問題