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

Переопределить свойства из файла внешних свойств, если существует с помощью Spring

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

<context:property-placeholder location="classpath:project.properties"/> 

Теперь я хочу переопределить несколько свойств из некоторого внешнего файла свойств, который не находится в пути к классам.

Скажем, у меня где-то развернут мой проект, и мне нужно какое-то динамическое изменение конфигурации. Я не хочу делать обновления для кодовой базы проекта в контейнере (tomcat или любой предмет).

1.) Поэтому мне нужен способ, который обновляет (переопределяет) значения загруженного файла свойств Spring с моими последними обновлениями во внешнем файле свойств.

2.) Было бы здорово, если бы кто-то мог также поделиться способом обновления предварительно загруженных свойств.

4b9b3361

Ответ 1

Итак, мне нужен способ, который обновляет (переопределяет) значения загруженного файла свойств spring с моими последними обновлениями во внешнем файле свойств.

Вы можете использовать PropertyPlaceholderConfigurer.

Аналогично, если вы хотите использовать пространство имен context

<context:property-placeholder locations="classpath:yourClasspath.properties,file:/some/resource/path/filePropertiesToOverride.properites"/> 

или таким образом

<bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:yourClasspath.properties</value>
            <value>file:/some/resource/path/filePropertiesToOverride.properites</value>
        </list>
    </property>
</bean>

В соответствии с javadoc СвойстваLoaderSupport.setLocations(Resource [])

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

.

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

В данный момент вы используете PropertyPlaceholderConfigurer. Так как a PropertyPlaceholderConfigurer является BeanFactoryPostProcessor, он пересекает определения bean (представление объекта beans.xml) и заменяет строки свойств (например, ${someProp}). После этого beans получает экземпляр и инициализируется. Таким образом, невозможно "перезагрузить" свойства.

Еще больше нужно учитывать, хотите ли вы создать приложение, которое может реагировать на изменения свойств во время выполнения:

  • Как вы можете инициировать изменение в Runtime? Например. таймер, который опросает файл свойств для изменений, JMX,...?
  • Как узнают об обновлениях классы, зависящие от свойств? Например. реализация прослушивателя.
  • Как синхронизировать обновления многих зависимых свойств? Например. представьте, что произойдет, если свойства будут обновляться во время запроса веб-приложения без синхронизации. Часть запроса может использовать старую и другую новые свойства.

По крайней мере, я бы рекомендовал использовать конфигурацию apache commons. Но это всего лишь структура, которая решает несколько проблем, и вам все равно придется думать о решениях вышеперечисленных вопросов.