Далее обновленный ответ для покрытия сценария компонентов-
Другой подход, поддерживаемый яровой 2.5.x + является то, что из сценария боба. Вы можете использовать различные языки для своего скрипта - BeanShell, вероятно, наиболее интуитивно понятен, учитывая, что он имеет тот же синтаксис, что и Java, но для этого требуются некоторые внешние зависимости. Однако примеры приведены в Groovy.
Раздел 24.3.1.2 из Spring Documentation охватывает как настроить это, но вот некоторые характерные отрывки, иллюстрирующие подход, который я отредактировал, чтобы сделать их более применимо к вашей ситуации:
<beans>
<!-- This bean is now 'refreshable' due to the presence of the 'refresh-check-delay' attribute -->
<lang:groovy id="messenger"
refresh-check-delay="5000" <!-- switches refreshing on with 5 seconds between checks -->
script-source="classpath:Messenger.groovy">
<lang:property name="message" value="defaultMessage" />
</lang:groovy>
<bean id="service" class="org.example.DefaultService">
<property name="messenger" ref="messenger" />
</bean>
</beans>
С Groovy скрипт вида:
package org.example
class GroovyMessenger implements Messenger {
private String message = "anotherProperty";
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message
}
}
Как системный администратор хочет внести изменения, то они (или) можно редактировать содержимое сценария соответствующим образом. Сценарий не является частью развернутого приложения и может ссылаться на известное местоположение файла (или тот, который настроен через стандартный PropertyPlaceholderConfigurer во время запуска).
Хотя в примере используется класс Groovy, вы можете получить код выполнения класса, который читает простой файл свойств. Таким образом, вы никогда не редактируете скрипт напрямую, просто коснитесь его, чтобы изменить метку времени. Это действие затем запускает перезагрузку, что, в свою очередь, вызывает обновление свойств из (обновленного) файла свойств, которое, наконец, обновляет значения в контексте Spring и выключается.
В документации указывается, что этот метод не работает для инжекции конструктора, но, возможно, вы можете обойти это.
Обновленный ответ для покрытия динамическое свойство изменяется
Quoting from this article, который provides full source code, один подход является:
* a factory bean that detects file system changes
* an observer pattern for Properties, so that file system changes can be propagated
* a property placeholder configurer that remembers where which placeholders were used, and updates singleton beans’ properties
* a timer that triggers the regular check for changed files
Паттерн Наблюдатель осуществляется интерфейсов и классов ReloadableProperties, ReloadablePropertiesListener, СвойстваReloadedEvent и ReloadablePropertiesBase. Ни один из них особенно интересен, просто нормальный прослушиватель. Класс DelegatingProperties служит для прозрачно обменивать текущие свойства, когда свойства обновлены. Мы только обновляем всю карту недвижимости сразу, так что приложение может избежать непоследовательности промежуточных состояний (подробнее об этом ).
Теперь ReloadablePropertiesFactoryBean может быть написана для создания экземпляра ReloadableProperties (вместо экземпляра свойства, как это делает PropertiesFactoryBean). Когда предложит это сделать, RPFB проверяет время изменения файла , и если необходимо , обновляет его ReloadableProperties. Это вызывает механизм наблюдателя.
В нашем случае единственным слушателем является ReloadingPropertyPlaceholderConfigurer. Он ведет себя точно так же, как стандартная пружина PropertyPlaceholderConfigurer, за исключением , что он отслеживает все виды использования заполнителей. Теперь, когда свойства перезагружены, все виды использования каждого модифицированного свойства найдены, и свойства этих одноэлементных бобов снова назначаются .
Оригинальный ответ ниже покрытие статических изменений свойств:
Похоже, вы просто хотите, чтобы ввести внешние свойства в ваш контекст Spring. PropertyPlaceholderConfigurer
предназначен для этой цели:
<!-- Property configuration (if required) -->
<bean id="serverProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<!-- Identical properties in later files overwrite earlier ones in this list -->
<value>file:/some/admin/location/application.properties</value>
</list>
</property>
</bean>
вы затем ссылаться на внешние свойства с Ant синтаксических заполнителей (которые могут быть вложены, если вы хотите от Spring 2.5.5 и далее)
<bean id="example" class="org.example.DataSource">
<property name="password" value="${password}"/>
</bean>
Затем обеспечить что файл application.properties доступен только для пользователя admin и пользователя, запускающего приложение.
Пример применения.Свойства:
пароль = Aardvark
Таким образом, компонент конфигурации должен быть обновлен во время выполнения - или каждый раз, когда администратор изменяет значения? Я что твой вопрос? Или вы хотите, чтобы «DataSource' /' MailSender »использовали обновленную конфигурацию во время выполнения? Или это так? – madhurtanwani
Это второе: я хочу обновить введенные значения конфигурации во время выполнения (см. Edit в OP). –