2012-02-09 11 views
8

Ho una stringa che sto autoacciando come un bean. Il valore per String viene impostato tramite un file delle proprietà e viene caricato in fase di esecuzione. Quel che posso verificare. Ecco il mio XML:Come aggiornare il valore di un bean stringa @Autowired in primavera?

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

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

E nella mia richiesta, ho autowire nel chicco:

@Component 
public class Foo { 

    @Autowired 
    private String loadedProp; 
} 

Tutto funziona da dandy. Ho più componenti che si autowire in questo bean. Quello che sto cercando di fare è, mentre l'applicazione è in esecuzione, aggiornare il valore del bean per essere qualcos'altro, in modo che ovunque il bean sia avviato automaticamente, utilizza il valore più aggiornato. È possibile farlo, o devo solo riavviare ogni volta che voglio cambiare il valore?

+0

Possibile duplicato di http://stackoverflow.com/questions/2008175/apply-dynamic-properties-to-a-bean-at-runtime – beny23

+0

questo collegamento potrebbe essere utile http://forum.springsource.org/archive /index.php/t-37557.html dai un'occhiata all'ultimo post lì –

+0

@ beny23 Ah, grazie. Questo non si è presentato nella mia ricerca. – Pat

risposta

3

Dopo aver letto alcune delle altre risposte e commenti, sono stato in grado di trovare una soluzione. Ho finito per creare una semplice classe:

public class LPropBean { 

    private String loadedProp; 

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

    // getters and setters... 
} 

ho aggiornato il mio file XML:

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

e aggiornato di tutti i @Component s che autowire nel chicco:

@Autowire 
private LPropBean lPropBean; 

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

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

I' Sono sicuro che c'è un modo più elegante, ma questo ha funzionato esattamente come ne avevo bisogno.

3

Poiché String è immutabile, non è possibile modificare solo il valore sottostante e aggiornare tutti quelli che hanno un riferimento.

È possibile modificare il riferimento del String che un'istanza di Foo è trattenendo per puntare a un diverso String, ma sarà realizzato solo dagli oggetti che stanno lavorando con lo specifico Foo aggiornati. Se Foo è un singleton di primavera, questo non dovrebbe essere un problema però ...

+0

Drat. Quindi sarei in grado di aggirare questo autowiring una classe che ha una stringa come una proprietà e l'aggiornamento di tale proprietà? O cadrebbe ancora nella stessa trappola? – Pat

+0

puoi usare un oggetto MutableObject di apache.com per esempio e usare getter/setter lì forse? –

+0

Sembra plausibile, ma vorrei anche dare un'occhiata ad alcuni dei suggerimenti che sono venuti dai commenti. Di nuovo, dipende da chi hai dato questo 'String' e se le cose sono gestite da Spring. –

0

Ogni volta che si desidera modificare i valori iniettati a molla modificando la configurazione, si dovrà riavviare il contenitore, che di solito comporta riavviare il tuo server.

Problemi correlati