it-swarm.com.de

lesen der Systemumgebungsvariablen in Spring applicationContext

Wie liest man die Systemumgebungsvariable im Anwendungskontext?

Ich möchte etwas wie:

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

oder

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

abhängig von der Umgebung.

Kann ich so etwas in meinem Anwendungskontext haben? 

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

wobei der tatsächliche Wert basierend auf der SYSTEM ENVIRONMENT VARIABLE festgelegt wird

Ich verwende Spring 3.0

96
jai

Überprüfen Sie diesen Artikel . Es gibt mehrere Möglichkeiten, dies zu tun, über die PropertyPlaceholderConfigurer , die externe Eigenschaften unterstützt (über die systemPropertiesMode-Eigenschaft).

48
Bozho

Sie sind in der Nähe: o) Spring 3.0 fügt Spring Expression Language hinzu. Sie können verwenden 

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

In Kombination mit Java ... -Denv=QA sollte das Problem gelöst werden.

Beachten Sie auch einen Kommentar von @yiling:

Um auf die Systemumgebungsvariable zuzugreifen, ist dies die Betriebssystemebene Variablen wie amoe kommentiert, wir können einfach "systemEnvironment" .__ verwenden. statt "systemProperties" in dieser EL. Mögen #{systemEnvironment['ENV_VARIABLE_NAME']}

99
amra

Heutzutage kann man setzen  

@Autowired
private Environment environment;

in Ihrem @Component, @Bean usw. und greifen Sie dann über die Environment-Klasse auf die Eigenschaften zu:

environment.getProperty("myProp");

Für eine einzelne Eigenschaft in einem @Bean

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

Ein anderer Weg sind die praktischen @ConfigurationProperties-Beans:

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

Hinweis: Denken Sie daran, Eclipse nach dem Festlegen einer neuen Umgebungsvariablen neu zu starten

39
Dariusz

Ja, Sie können beispielsweise <property name="defaultLocale" value="#{ systemProperties['user.region']}"/> ausführen.

Die Variable systemProperties ist vordefiniert, siehe 6.4.1 XML-basierte Konfiguration .

25
Istao

Stellen Sie sicher, dass Sie in Ihre Bean-Definition "searchSystemEnvironment" einfügen und "true" festlegen. Wenn Sie einen Pfad zu einer Datei erstellen, geben Sie ihn als Datei an: /// url.

Wenn Sie beispielsweise eine Konfigurationsdatei in haben 

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

dann setzen Sie eine Umgebungsvariable wie folgt:

MY_ENV_VAR_PATH=/testapp/config

und Ihre App kann die Datei mit einer Bean-Definition wie folgt laden:

z.B.

<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
Brad Parks

Mit Spring EL können Sie eis Beispiel wie folgt schreiben

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

Für meinen Anwendungsfall musste ich nur auf die Systemeigenschaften zugreifen, aber Standardwerte angeben, falls sie nicht definiert sind.

Das ist wie man es macht:

<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>
5
eis

Deklarieren Sie den Platzhalter für die Immobilie wie folgt

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

Nehmen wir an, Sie möchten System.property("Java.io.tmpdir") für Ihre Tomcat-Bean oder eine Bean lesen, und fügen Sie dann in Ihrer Eigenschaftendatei Folgendes hinzu:

Tomcat.tmp.dir=${Java.io.tmpdir}
4
Justin Patel

Sie können Ihre Variablenattribute in einer Eigenschaftendatei angeben und umgebungsspezifische Eigenschaftendateien wie local.properties, production.propertied usw. definieren.

Basierend auf der Umgebung kann eine dieser Eigenschaftendateien in einer der Listener gelesen werden, die beim Start aufgerufen wird, wie beispielsweise der ServletContextListener.

Die Eigenschaftsdatei enthält die umgebungsspezifischen Werte für verschiedene Schlüssel.

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

Beispiel "production.properties"

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]

Für die Verwendung dieser Eigenschaftendatei können Sie REsource wie unten beschrieben verwenden

        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 kann als Umgebungsvariable mit entsprechenden Werten für die lokale Umgebung und die Produktionsumgebung definiert werden. 

Mit diesen Änderungen hat appplicationContext.xml die folgenden Änderungen

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

Hoffe das hilft .

1
Sunil

Das ist wie man es macht:

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

Denken Sie jedoch daran, dass der Frühling zuerst geladen wird und dann diese Bean MethodInvokingFactoryBean. Wenn Sie also versuchen, dies für Ihren Testfall zu verwenden, stellen Sie sicher, dass Sie das abhängige Element verwenden. Für z. in diesem Fall

Wenn Sie es für Ihre Hauptklasse verwenden, setzen Sie diese Eigenschaft besser mit pom.xml als

<systemProperty>
    <name>deployment.env</name>
    <value>dev</value>
</systemProperty>
1
Atit Shah

Danke an @Yiling. Das war ein Hinweis.

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

Danach sollten Sie eine Umgebungsvariable mit dem Namen 'FILE_PATH' haben. Stellen Sie sicher, dass Sie Ihr Terminal/Ihre IDE neu starten, nachdem Sie diese Umgebungsvariable erstellt haben.

0
Jaikrat