Ответ 1
Я бы, скорее всего, полностью изменил решение: прямо введите системное свойство, а не вставляя свойство, которое ссылается на системное свойство
например.
@Value("#{ systemProperties['JAVA_MY_ENV'] }")
private String myVar;
или
<property name ="myVar" value="#{systemProperties['JAVA_MY_ENV']}"/>
Я использую конфигуратор заполнителя свойств, подобный этому
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:someprops.properties</value>
</list>
</property>
<property name="ignoreResourceNotFound" value="true" />
<property name="searchSystemEnvironment" value="true" />
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
Вы также должны помнить о том, чтобы передать параметр в программу, используя
-DJAVA_MY_ENV=xyz
Таким образом, когда вы запускаете производственную версию, вы можете передать одну вещь, а когда вы запускаете тесты другой.
Также я часто делаю что-то вроде этого:
<property name="locations">
<list>
<value>classpath:someprops.properties</value>
<value>classpath:someprops-{environment}.properties</value>
</list>
</property>
где среда - prod/stage/test/int/ci/local (1 для среды - на данный момент у вас может быть только 2 или 3). Вы можете передать переменную окружения в программу. Любые свойства, которые должны быть одинаковыми независимо от того, будет ли его создание/выполнение на вашем локальном компьютере/тестах в файле свойств someprops.properties. Любые объекты, специфичные для среды/способа ее запуска, как будут поступать в более конкретном файле (вы должны поместить его в файл someprops.properties, а также по умолчанию, если не переопределенный механизм)
например. в classpath: someprops.properties
url=www.mysite.com
в пути к классам: someprops-local.properties
url=localhost
Используя эту основную идею, вы можете легко отделить тесты и обычные нормальные свойства программы.