Avec cette classe
@Component
public class Sample {
@Value("${my.name}")
public static String name;
}
Si j'essaye Sample.name
, c'est toujours «nul». Alors j'ai essayé ça.
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;
}
}
Ce code fonctionne. Sample.name
est correctement réglé. Est-ce bon ou pas? Sinon, y a-t-il quelque chose de plus bon? Et comment le faire?
spring
code-injection
Whiteship
la source
la source
Réponses:
Tout d'abord, les
public static
non-final
champs sont mauvais . Spring ne permet pas d'injecter de tels champs pour une raison.Votre solution de contournement est valide, vous n'avez même pas besoin de getter / setter, le
private
champ suffit. D'autre part, essayez ceci:@Value("${my.name}") public void setPrivateName(String privateName) { Sample.name = privateName; }
(fonctionne avec
@Autowired
/@Resource
). Mais pour vous donner quelques conseils constructifs: créez une deuxième classe avecprivate
field et getter au lieu depublic static
field.la source
Ceci est mon exemple de code pour charger la variable statique
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; } }
la source
Spring utilise l'injection de dépendances pour renseigner la valeur spécifique lorsqu'il trouve l'annotation @Value. Cependant, au lieu de transmettre la valeur à la variable d'instance, elle est transmise au setter implicite à la place. Ce setter gère ensuite la population de notre valeur 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; } }
la source