2012-02-09 6 views
8

У меня есть String, что я autowiring как фасоль. Значение для String устанавливается через файл свойств и загружается во время выполнения. Я могу это проверить. Вот мой XML:Как обновить значение @Autowired String bean весной?

<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 в бобе:

@Component 
public class Foo { 

    @Autowired 
    private String loadedProp; 
} 

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

+0

Возможный дубликат http://stackoverflow.com/questions/2008175/apply-dynamic-properties-to-a-bean-at-runtime – beny23

+0

Эта ссылка может помочь вам http://forum.springsource.org/archive /index.php/t-37557.html взгляните на последний пост там –

+0

@ beny23 А, спасибо. Это не оказалось в моем поиске. – Pat

ответ

3

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

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 в бобе:

@Autowire 
private LPropBean lPropBean; 

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

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

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

3

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

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

+0

Drat. Могу ли я обойти это путем автоподготовки класса, который имеет свойство String как свойство, и обновление этого свойства? Или я все равно попаду в ту же ловушку? – Pat

+0

вы можете использовать MutableObject apache.commons, например, и использовать геттер/сеттер там, возможно? –

+0

Это звучит правдоподобно, но я также хотел бы взглянуть на некоторые из предложений, которые пришли из комментариев. Опять же, это зависит от того, кому вы дали эту «String», и независимо от того, управляются ли Spring. –

0

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