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

Как обновить значение @Autowired String bean весной?

У меня есть String, что я autowiring как фасоль. Значение для 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>

И в моем приложении, я autowire в bean-компоненте:

@Component
public class Foo {

  @Autowired
  private String loadedProp;
}

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

4b9b3361

Ответ 1

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

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 что autowire в bean-компоненте:

@Autowire
private LPropBean lPropBean;

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

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

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

Ответ 2

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

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

Ответ 3

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