Как мне прочитать аргументы JVM в Spring applicationContext.xml - PullRequest
20 голосов
/ 08 апреля 2011

У меня есть веб-приложение JSF с Spring, и я пытаюсь найти способ ссылаться на аргументы JVM из applicationContext.xml.Я запускаю JVM с аргументом среды (например, -Denv = development).Я нашел и попробовал несколько разных подходов, в том числе:

<bean id="myBean" class="com.foo.bar.myClass">
  <property name="environment">
    <value>${environment}</value>
  </property>
</bean>

Но, когда метод setter вызывается в MyClass, передается строка "$ {environment}" вместо "development".У меня есть обходной путь для использования System.getProperty (), но было бы лучше и чище иметь возможность устанавливать эти значения через Spring.Есть ли способ сделать это?

Редактировать: То, что я должен был упомянуть ранее, это то, что я загружаю свойства из моей базы данных, используя соединение JDBC.Это, кажется, добавляет сложности, потому что когда я добавляю заполнитель свойства в свою конфигурацию, свойства, загруженные из базы данных, переопределяются заполнителем свойства.Я не уверен, зависит ли это от порядка или что-то в этом роде.Как будто я могу сделать одно или другое, но не оба.

Редактировать: в данный момент я загружаю свойства, используя следующую конфигурацию:

<bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc.mydb.myschema"/> 
</bean>

<bean id="props" class="com.foo.bar.JdbcPropertiesFactoryBean">
    <property name="jdbcTemplate">
        <bean class="org.springframework.jdbc.core.JdbcTemplate">
            <constructor-arg ref="myDataSource" />
        </bean>
    </property>
</bean>

<context:property-placeholder properties-ref="props" />

Ответы [ 6 ]

27 голосов
/ 08 апреля 2011

Вы можете использовать выражения Spring EL, тогда это #{systemProperties.test} для -Dtest="hallo welt"

В вашем случае это должно быть:

<bean id="myBean" class="com.foo.bar.myClass">
  <property name="environment">
    <value>#{systemProperties.environment}</value>
  </property>
</bean>

Вместо #$ не является ошибкой!

$ относится к заполнителям, тогда как # относится к бобам, а systemProperties - к бобам.


Может быть, это только орфографическая ошибка, но может быть причиной вашей проблемы: В примере для оператора командной строки вы называете переменную env

(-Denv=development, например...

Но в конфигурации пружины вы называете это environment. Но оба должны быть равны, конечно!

10 голосов
/ 08 апреля 2011

Если вы зарегистрируете PropertyPlaceholderConfigurer, он будет использовать системные свойства как запасной вариант.

Например, добавьте

<context:property-placeholder/>

в вашу конфигурацию.Затем вы можете использовать ${environment} в конфигурации XML или в аннотациях @Value. 1008 *

4 голосов
/ 12 апреля 2011

Вы можете загрузить файл свойств, основываясь на системном свойстве env, например:

   <bean id="applicationProperties"
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      <property name="ignoreResourceNotFound" value="false" />
      <property name="ignoreUnresolvablePlaceholders" value="true" />
      <property name="searchSystemEnvironment" value="false" />
      <property name="locations">
         <list>
            <value>classpath:myapp-${env:prod}.properties</value>
         </list>
      </property>
   </bean>

Если env не установлен по умолчанию, его можно использовать в производственном процессе, в противном случае команды разработчиков и тестировщиков могут получить представление о приложении.установив -Denv=development или -Denv=testing соответственно.

1 голос
/ 24 ноября 2015

Используйте #{systemProperties['env']}. В основном передайте propertyName, используемое в командной строке Java, как -DpropertyName=value. В этом случае это было -Denv=development, поэтому использовали env.

0 голосов
/ 16 сентября 2015

Spring 3.0.7

<context:property-placeholder location="classpath:${env:config-prd.properties}" />

И во время выполнения установите: -Denv = config-dev.properties

Если не установлено, "env" будет использовать по умолчанию "config-prd.properties"».

0 голосов
/ 04 мая 2015

Интересно, что Spring эволюционировал, чтобы обрабатывать эту потребность более изящно с помощью PropertySources: http://spring.io/blog/2011/02/15/spring-3-1-m1-unified-property-management/

С несколькими конфигурациями и, возможно, с пользовательским ApplicationInitializer, если вы работаете с веб-приложением, вы можете иметь заполнитель свойстваобрабатывать System, Environment и пользовательские свойства.Spring предоставляет PropertySourcesPlaceholderConfigurer, который используется, когда у вас есть в вашей конфигурации Spring.Тот будет искать свойства в ваших файлах свойств, затем System, и, наконец, Environment.

...