Как обновить значение @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-объект автообновлен, он использует самое последнее значение. Возможно ли это сделать, или мне просто нужно перезагружать каждый раз, когда я хочу изменить значение?
Ответы
Ответ 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
Каждый раз, когда вы хотите изменить свои весенние значения, изменив конфигурацию, вам придется перезагрузить контейнер, что обычно включает перезагрузку вашего сервера.