Как прочитать системную переменную среды в 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 устанавливается на основе переменной среды SYSTEM ENVIRONMENT

Я использую Spring 3.0

95 голосов | спросил jai 19 +04002010-10-19T08:57:55+04:00312010bEurope/MoscowTue, 19 Oct 2010 08:57:55 +0400 2010, 08:57:55

10 ответов


0

Проверьте эта статья . Это дает вам несколько способов сделать это через PropertyPlaceholderConfigurer , который поддерживает внешние свойства (через systemPropertiesMode свойство).

ответил Bozho 19 +04002010-10-19T10:07:33+04:00312010bEurope/MoscowTue, 19 Oct 2010 10:07:33 +0400 2010, 10:07:33
0

Вы близки: о) В Spring 3.0 добавлен язык выражений Spring . Вы можете использовать

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

В сочетании с java ... -Denv=QA должен решить вашу проблему.

Обратите внимание также на комментарий @yiling:

  

Для доступа к системной переменной среды, то есть к уровню ОС   переменные, как прокомментировал amoe, мы можем просто использовать "systemEnvironment"   вместо "systemProperties" в этом EL. подобно   #{systemEnvironment['ENV_VARIABLE_NAME']}

ответил amra 19 +04002010-10-19T10:02:12+04:00312010bEurope/MoscowTue, 19 Oct 2010 10:02:12 +0400 2010, 10:02:12
0

В настоящее время вы можете положить

@Autowired
private Environment environment;

в вашем @Component, @Bean и т. д., а затем получите доступ к свойствам через класс Environment:

environment.getProperty("myProp");

Для одного свойства в @Bean

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

Другим способом являются удобные @ConfigurationProperties bean:

@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 после установки новой переменной среды

ответил Dariusz 20 PMpMon, 20 Apr 2015 13:09:57 +030009Monday 2015, 13:09:57
0

Да, вы можете сделать <property name="defaultLocale" value="#{ systemProperties['user.region']}"/>, например.

Переменная systemProperties предопределена, см. 6.4.1 Конфигурация на основе XML .

ответил Istao 19 +04002010-10-19T09:59:52+04:00312010bEurope/MoscowTue, 19 Oct 2010 09:59:52 +0400 2010, 09:59:52
0

В своем определении бина обязательно включите «searchSystemEnvironment» и установите для него «true». И если вы используете его для построения пути к файлу, укажите его как файл: ///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>
ответил Brad Parks 6 22012vEurope/Moscow11bEurope/MoscowTue, 06 Nov 2012 21:14:38 +0400 2012, 21:14:38
0

Используя Spring EL, вы можете пример eis написать следующим образом

<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>
ответил Mikus 25 MarpmTue, 25 Mar 2014 13:53:23 +04002014-03-25T13:53:23+04:0001 2014, 13:53:23
0

Для моего случая использования мне нужно было получить доступ только к системным свойствам, но предоставить значения по умолчанию, если они не определены.

Вот как вы это делаете:

 <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>
ответил eis 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 10 Sep 2013 20:20:18 +0400 2013, 20:20:18
0

Объявите заполнитель свойства следующим образом

<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}
ответил Justin Patel 22 MarpmTue, 22 Mar 2016 13:03:11 +03002016-03-22T13:03:11+03:0001 2016, 13:03:11
0

Вот как вы это делаете:

<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>
ответил Atit Shah 27 MarpmFri, 27 Mar 2015 17:34:54 +03002015-03-27T17:34:54+03:0005 2015, 17:34:54
0

Вы можете упомянуть свои переменные атрибуты в файле свойств и определить файлы свойств для конкретной среды, такие как 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

Пример "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]

Для использования этого файла свойств вы можете использовать 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}" />

Надеюсь, это поможет.

ответил Sunil 18 FriEurope/Moscow2015-12-18T07:35:30+03:00Europe/Moscow12bEurope/MoscowFri, 18 Dec 2015 07:35:30 +0300 2015, 07:35:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132