Как мне обновить значение бина @Autowired String в Spring? - PullRequest
10 голосов
/ 09 февраля 2012

У меня есть строка, которую я собираю как боб.Значение для String устанавливается через файл свойств и загружается во время выполнения.Это я могу проверить.Вот мой XML:

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

<bean id="loadedProp" class="java.lang.String">
   <constructor-arg>
      <value>${loaded-prop}</value>
   </constructor-arg>
</bean>

И в моем приложении я автоматически подключаюсь в bean-компоненте:

@Component
public class Foo {

  @Autowired
  private String loadedProp;
}

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

Ответы [ 3 ]

3 голосов
/ 09 февраля 2012

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

public class LPropBean {

   private String loadedProp;

   public LPropBean(String loadedProp) {
       this.loadedProp = loadedProp;
   }

   // getters and setters...
}

Я обновил свой XML-файл:

<bean id="lPropBean" class="LPropBean">
  <constructor-arg>
    <value>${loaded-prop}</value>
  </constructor-arg>
</bean>

И обновлены все @Component, которые автоматически подключаются в bean-компоненте:

@Autowire
private LPropBean lPropBean;

// ... later ...
lPropBean.setLoadedProp(newProp);

// ... later ...
lPropBean.getLoadedProp();

Я уверен, что есть более элегантный способ, но он работал именно так, как мне было нужно.

3 голосов
/ 09 февраля 2012

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

Вы можете изменить ссылку на String, которую держит экземпляр Foo, чтобы указать на другое String, но оно будет реализовано только объектами, которые работают с конкретным Foo вами обновлено. Если Foo является синглтоном Spring, это не должно вызывать проблем ...

0 голосов
/ 09 февраля 2012

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

...