Свойство Spring Reload — компонент не обновлен

У меня есть веб-сервис, который извлекает свойство из файла application.properties, расположенного на сервере, например query[testSql] через spring

public class RuntimeEnvironmentPropertiesConfigurerextends PropertyPlaceholderConfigurer
        implements InitializingBean, RuntimeEnvironmentInterface

Теперь этот запрос вводится в мой дао Spring bean.

<bean id="dao" name="dao" class="com.dao.DaoImpl">
  <property name="ackJdbcTemplate"  ref="ackJdbcTemplate" />  
  <property name="testSql" value="${dao.query.tSql}" />
 </bean>

С помощью Как я могу перезагрузить файл свойств в Spring 4 с помощью аннотаций? ссылка Я могу перезагрузить свойство во время выполнения. проверено

@Autowired
public RuntimeEnvironmentInterface propertyLoader;

....

  Set s=propertyLoader.getProperties();
        Iterator itr=s.iterator();
        while(itr.hasNext()){
        String tempKey=String.valueOf(itr.next());
        logger.info(tempKey +"==="+propertyLoader.getProperty(tempKey));

но проблема в том, что мой компонент dao не принимает обновленный запрос testSql. Он работает на старом, пока я не перезапущу приложение.

Я нашел способ, как в отдельном сопоставлении URL-адресов, я написал метод, который выполняет следующую работу:

Dao.setTestSql(propertyLoader.getProperty("com.dao.query.tSql"));

и человек, который обновляет, должен нажать на URL-адрес после обновления свойства.

Но это я должен сделать для всего bean-компонента и введенного свойства. Это довольно лихорадочная работа. Я пропускаю одно свойство, и я обречен. Есть ли другой способ автоматического обновления внедренного bean-компонента? Мне нужно, чтобы мои обновленные свойства отражались без перезапуска.

Я пытался понять данный код wuenschenswert, но не смог.


person juneSakura    schedule 21.06.2017    source источник
comment
Почему вы не используете propertyLoader в своем DAO?   -  person Alexey Soshin    schedule 21.06.2017
comment
@Alexey Soshin Спасибо за предложение, но в общем приложении более 12 bean-компонентов и так много свойств, поэтому я ищу способы перезагрузить все свойства без необходимости переходить к каждому bean-компоненту Spring и устанавливать свойства.   -  person juneSakura    schedule 22.06.2017


Ответы (1)


<property name="testSql" value="${dao.query.tSql}" />

Это означает, что при инициализации компонента Spring вычисляет значение свойства, используя свойство с именем dao.query.tSql. Таким образом, при инициализации контекста будет вызываться метод setTestSql(), вот и все. Когда ваши свойства перезагружаются, загрузчик свойств не будет вставлять новое значение свойства в ваш bean-компонент.

Но, как предлагает Алексей, вы можете извлекать значение свойства из вашего propertyLoader каждый раз, когда выполняете этот SQL-запрос следующим образом:

final String actualQuery = propertyLoader.getProperty("com.dao.query.tSql");
executeQuery(actualQuery);

Есть проблема: это может начать выглядеть некрасиво, когда количество свойств увеличится. Но это можно облегчить, если вы создадите некоторый класс, инкапсулирующий эти доступы; этот класс будет предоставлять свойства через свои методы. Пример:

public class DynamicProperties {
    private final RuntimeEnvironmentInterface propertyLoader;

    public DynamicProperties(RuntimeEnvironmentInterface propertyLoader) {
        this.propertyLoader = propertyLoader;
    }

    public String tSql() {
        return propertyLoader.getProperty("dao.query.tSql");
    }

    ... other methods for other properties
}

Затем создайте экземпляр этого класса в вашем Dao:

private DynamicProperties dynamicProperties = new DynamicProperties(propertyLoader);

А потом

executeQuery(dynamicProperties.tSql());

Небольшой бонус: вы можете выполнять преобразования типов в том же классе DynamicProperties (например, когда ваше свойство int, а не String).

person Roman Puchkovskiy    schedule 21.06.2017
comment
@RomanЭто довольно крутая идея насчет обертки !!! I Но в общем приложении более 12 bean-компонентов, и в эти bean-компоненты введено так много свойств, поэтому я ищу способы перезагрузить все свойства без необходимости переходить к каждому bean-компоненту Spring и задавать свойства. Таким образом, в будущем они добавят удаление или обновление любого определения компонента, нет необходимости изменять метод. Метод будет повторно загружать все свойства из файла и обновлять свойство всякий раз, когда оно используется. - person juneSakura; 22.06.2017