2012-02-09 12 views
8

Mam String, że jestem autowiring jako fasoli. Wartość dla String jest ustawiana za pośrednictwem pliku właściwości i jest ładowana w środowisku wykonawczym. Tyle mogę zweryfikować. Tu jest mój XML:Jak zaktualizować wartość @Autowired bean fasoli na wiosnę?

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

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

A w mojej aplikacji autowire w fasoli:

@Component 
public class Foo { 

    @Autowired 
    private String loadedProp; 
} 

Wszystko działa dandys. Mam wiele komponentów, które są automatycznie programowane w tym komponencie bean. Próbuję zrobić, podczas gdy aplikacja jest uruchomiona, aktualizować wartość fasoli, aby była czymś innym, więc wszędzie tam, gdzie komponuje się ziarno, używa najbardziej aktualnej wartości. Czy można to zrobić, czy po prostu muszę ponownie uruchomić za każdym razem, gdy chcę zmienić wartość?

+0

Możliwy duplikat http://stackoverflow.com/questions/2008175/apply-dynamic-properties-to-a-bean-at-runt – beny23

+0

ten link może ci pomóc http://forum.springsource.org/archive /index.php/t-37557.html spójrz na ostatni wpis: –

+0

@ beny23 Ah, dziękuję. To nie pojawiało się w moich poszukiwaniach. – Pat

Odpowiedz

3

Po przeczytaniu kilku innych odpowiedzi i komentarzy, udało mi się znaleźć rozwiązanie. Skończyło się tworząc prostą klasę:

public class LPropBean { 

    private String loadedProp; 

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

    // getters and setters... 
} 

I uaktualniony mój plik XML:

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

i aktualizowane wszystkie @Component s że autowire w fasoli:

@Autowire 
private LPropBean lPropBean; 

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

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

I Na pewno jest bardziej elegancki sposób, ale działało dokładnie tak, jak tego potrzebowałem.

3

Ponieważ String jest niezmienny, nie można po prostu zmienić jego wartości bazowej i zaktualizować wszystkich, którzy mają do niego odniesienie.

Można zmienić odniesienie do String że wystąpienie Foo trzyma się zwrócić do innego String, ale będzie on realizowany tylko przez obiekty, które pracują z konkretnym Foo aktualizowania. Jeśli Foo jest singletonem wiosennym, to nie powinno to być problemem ...

+0

Drat. Czy byłbym w stanie obejść ten problem przez autowiring klasy, która ma ciąg jako właściwość i aktualizowanie tej właściwości? Czy nadal wpadłbym w tę samą pułapkę? – Pat

+0

można użyć MutableObject z apache.commons na przykład i może użyć getter/setter? –

+0

To brzmi wiarygodne, ale chciałbym również rzucić okiem na niektóre sugestie, które wynikają z komentarzy. Znowu zależy to od tego, komu dałeś ten "Ciąg" i czy rzeczy są zarządzane w Wiosen. –

0

Za każdym razem, gdy chcesz zmienić wartości wstrzykiwane przez sprężynę poprzez zmianę konfiguracji, będziesz musiał ponownie uruchomić pojemnik, co zwykle wymaga ponowne uruchomienie serwera.

Powiązane problemy