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
Ü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).
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']}
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
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 .
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>
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>
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>
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}
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 .
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>
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.