2012-02-09 12 views
8

Tengo una cadena que estoy autocableando como un frijol. El valor para String se establece mediante un archivo de propiedades y se carga en el tiempo de ejecución. Eso puedo verificar. Aquí está mi XML:¿Cómo actualizo el valor de @Autowired String bean en Spring?

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

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

Y en mi solicitud, Autowire en el grano:

@Component 
public class Foo { 

    @Autowired 
    private String loadedProp; 
} 

Todo funciona Dandy. Tengo varios componentes que se conectan automáticamente en este bean. Lo que estoy tratando de hacer es, mientras la aplicación se está ejecutando, actualizar el valor del bean para que sea algo más, de modo que en todos los lugares donde el bean esté autoconectado, use el valor más actualizado. ¿Es posible hacer esto o solo necesito reiniciar cada vez que deseo cambiar el valor?

+0

Posible duplicado de http://stackoverflow.com/questions/2008175/apply-dynamic-properties-to-a-bean-at-runtime – beny23

+0

Este enlace podría ayudarlo http://forum.springsource.org/archive /index.php/t-37557.html echa un vistazo a la última publicación allí –

+0

@ beny23 Ah, gracias. Eso no apareció en mi búsqueda. – Pat

Respuesta

3

Después de leer algunas de las otras respuestas y comentarios, pude encontrar una solución. Terminé la creación de una clase simple:

public class LPropBean { 

    private String loadedProp; 

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

    // getters and setters... 
} 

He actualizado mi archivo XML:

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

y actualizado todos los @Component s que Autowire en el grano:

@Autowire 
private LPropBean lPropBean; 

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

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

I' Estoy seguro de que hay una manera más elegante, pero esto funcionó exactamente como lo necesitaba.

3

Dado que String es inmutable, no puede simplemente cambiar su valor subyacente y hacer que se actualice a todos los que tengan una referencia al mismo.

Usted puede cambiar la referencia de la String que una instancia de Foo se aferra a apuntar a una diferente String, pero sólo serán realizadas por los objetos que están trabajando con la específica Foo informado. Si Foo es un resorte simple, esto no debería ser un problema ...

+0

Drat. Entonces, ¿sería capaz de evitar esto al autocablear una clase que tiene un String como propiedad y actualizar esa propiedad? ¿O seguiría cayendo en la misma trampa? – Pat

+0

puede usar un MutableObject de apache.commons por ejemplo y usar getter/setter tal vez? –

+0

Esto suena plausible, pero también me gustaría echar un vistazo a algunas de las sugerencias que han surgido de los comentarios. De nuevo, depende de a quién le haya dado este 'String' y si las cosas se administran o no en primavera. –

0

Cada vez que desee cambiar los valores inyectados por resorte cambiando la configuración, tendrá que reiniciar su contenedor, lo que generalmente implica reiniciando su servidor.

Cuestiones relacionadas