Подтвердить что ты не робот

Как читать аргументы JVM в Spring applicationContext.xml

У меня есть веб-приложение 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, вместо "development" передается строка "$ {environment}". У меня есть работа для использования 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" />
4b9b3361

Ответ 1

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

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

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

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

$ относится к держателям мест, а # относится к beans, а systemProperties - bean.


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

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

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

Ответ 2

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

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

<context:property-placeholder/>

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

Ответ 3

Вы можете загрузить файл свойств на основе системного свойства 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.

Ответ 4

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

Ответ 5

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

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

Ответ 6

Spring 3.0.7

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

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

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