2011-08-31 14 views
36

Con esta claseSpring: cómo inyectar un valor al campo estático?

@Component 
public class Sample { 

     @Value("${my.name}") 
    public static String name; 


} 

Si intento Sample.name, siempre es 'nulo'. Así que probé esto.

public class Sample { 

    public static String name; 

    @PostConstruct 
    public void init(){ 
     name = privateName; 
    } 

    @Value("${my.name}") 
    private String privateName; 

    public String getPrivateName() { 
     return privateName; 
    } 

    public void setPrivateName(String privateName) { 
     this.privateName = privateName; 
    } 

} 

Este código funciona. Sample.name está configurado correctamente. ¿Es esta la buena manera o no? Si no, ¿hay algo más que bueno? ¿Y, cómo hacerlo?

+0

Esto no se resolverá; si la variable estática se usa antes de la creación del objeto. por ejemplo, si la variable estática se usa en bloque estático para construir el recurso, entonces el recurso se construirá con nulo. –

Respuesta

55

Primeros de todos, public static no final campos son evil. Spring no permite la inyección en tales campos por una razón.

Su solución alternativa es válida, ni siquiera necesita getter/setter, private campo es suficiente. Por otra parte intente esto:

@Value("${my.name}") 
public void setPrivateName(String privateName) { 
    Sample.name = privateName; 
} 

(trabaja con @Autowired/@Resource). Pero para darle algunos consejos constructivos: Cree una segunda clase con el campo private y getter en lugar del campo public static.

+4

Para "los campos no finales públicos estáticos son malos", ¿podría darme algunas referencias? – Anderson

+3

No final significa que puede modificar el valor del campo, que, para un campo estático, implica el manejo de la concurrencia del hilo - a.k.a. dolor en la pila. –

+0

¿Cómo usar @Value con bloque estático? Por favor, guíanos ... Saludos, Neha –

Cuestiones relacionadas