Как читать аргументы 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" />
Ответы
Ответ 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".