Con esta clase
@Component
public class Sample {
@Value("${my.name}")
public static String name;
}
Si lo intento Sample.name
, siempre es "nulo". Así que intenté 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 buena forma o no? Si no es así, ¿hay algo más bueno? ¿Y, cómo hacerlo?
spring
code-injection
Whiteship
fuente
fuente
Respuestas:
En primer lugar, los
public static
nofinal
campos son malos . Spring no permite inyectar en tales campos por una razón.Su solución es válida, ni siquiera necesita getter / setter, el
private
campo es suficiente. Por otro lado, intente esto:@Value("${my.name}") public void setPrivateName(String privateName) { Sample.name = privateName; }
(trabaja con
@Autowired
/@Resource
). Pero para darle un consejo constructivo: cree una segunda clase conprivate
campo y captador en lugar depublic static
campo.fuente
Este es mi código de muestra para cargar variable estática
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class OnelinkConfig { public static int MODULE_CODE; public static int DEFAULT_PAGE; public static int DEFAULT_SIZE; @Autowired public void loadOnelinkConfig(@Value("${onelink.config.exception.module.code}") int code, @Value("${onelink.config.default.page}") int page, @Value("${onelink.config.default.size}") int size) { MODULE_CODE = code; DEFAULT_PAGE = page; DEFAULT_SIZE = size; } }
fuente
Spring usa la inyección de dependencia para completar el valor específico cuando encuentra la anotación @Value. Sin embargo, en lugar de entregar el valor a la variable de instancia, se entrega al establecedor implícito. Este establecedor luego maneja la población de nuestro valor NAME_STATIC.
@RestController //or if you want to declare some specific use of the properties file then use //@Configuration //@PropertySource({"classpath:application-${youeEnvironment}.properties"}) public class PropertyController { @Value("${name}")//not necessary private String name;//not necessary private static String NAME_STATIC; @Value("${name}") public void setNameStatic(String name){ PropertyController.NAME_STATIC = name; } }
fuente