как читать системную переменную среды в Spring applicationContext
как прочитать системную переменную среды в контексте приложения?
Я хочу что-то вроде :
<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
12 ответов:
Регистрация в этой статье. Это дает вам несколько способов сделать это, через
PropertyPlaceholderConfigurer, который поддерживает внешние свойства (черезsystemPropertiesModeсобственность)
вы близки: o) Весна 3.0 добавляет Язык Весеннего Выражения. Вы можете использовать
<util:properties id="dbProperties" location="classpath:config_#{systemProperties['env']}/db.properties" />в сочетании с
java ... -Denv=QAдолжно решить вашу проблему.обратите внимание также на комментарий @yiling:
чтобы получить доступ к системной переменной окружения, это уровень ОС переменные как прокомментировал амоэ, мы можем просто использовать " systemEnvironment" вместо "systemProperties" в этом EL. Как
#{systemEnvironment['ENV_VARIABLE_NAME']}
в настоящее время вы можете поставить
@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; }Примечание: просто не забудьте перезапустить eclipse после установки новой переменной среды
Да, вы можете сделать
<property name="defaultLocale" value="#{ systemProperties['user.region']}"/>например.переменная systemProperties предварительно, см. 6.4.1 конфигурация на основе XML.
в вашем определении bean обязательно включите " searchSystemEnvironment "и установите его в"true". И если вы используете его для построения пути к файлу, укажите его как файл: / / / url.
Так, например, если у вас есть файл config, расположенном в
/testapp/config/my.app.config.propertiesзатем установите переменную окружения следующим образом:
MY_ENV_VAR_PATH=/testapp/configи ваше приложение может загрузить файл, используя определение bean следующим образом:
например
<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>
С помощью Spring EL вы можете пример Эис написать следующим образом
<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>
для моего варианта использования мне нужно было получить доступ только к системным свойствам, но предоставить значения по умолчанию, если они не определены.
вот как вы это делаете:
<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>
объявите владельца места собственности следующим образом
<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}
вот как вы это делаете:
<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 загружается первым, а затем он загрузит этот боб MethodInvokingFactoryBean. Поэтому, если вы пытаетесь использовать это для своего тестового случая, убедитесь, что вы используете depends-on. Например, в этом случае
в случае, если вы используете его для вашего основного класса лучше установить это свойство с помощью pom.xml как
<systemProperty> <name>deployment.env</name> <value>dev</value> </systemProperty>
вы можете упомянуть свои переменные атрибуты в файле свойств и определить файлы свойств среды, такие как local.свойства, производство.имущих и т. д.
теперь на основе среды, один из этих файлов свойств может быть прочитан в одном слушатели вызываются при запуске, как ServletContextListener.
файл свойств будет содержать конкретные значения среды для различных ключей.
образец "местный.свойства"
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для использования этих свойств файла, вы можете использовать ресурс, как указано ниже
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}" />надеюсь, это поможет .
спасибо @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'. Убедитесь, что вы перезагрузили компьютер после создания этой переменной среды.
чтобы получить значение системной переменной, просто используйте приведенный ниже код:
System.getenv("property-name");
Comments