Je dois utiliser le paramètre injecté par @Value
dans la variable d'instance d'une classe et cette variable peut être réutilisée dans toutes ses classes enfants.
@Value(server.environment)
public String environment;
public String fileName = environment + "SomeFileName.xls";
Ici, le problème est l'initialisation de fileName puis l'injection de l'environnement. Donc, je reçois toujours null-SomeFileName.xls.
Quoi qu'il en soit, à transmettre pour initialiser le premier @Value
au printemps.
Vous pouvez donc utiliser @PostConstruct
. De documentation :
L'annotation PostConstruct est utilisée sur une méthode qui doit être exécuté après l’injection de dépendance pour effectuer toute opération initialisation.
@PostConstruct
vous permet d'effectuer des modifications après la définition des propriétés. Une solution serait quelque chose comme ceci:
public class MyService {
@Value("${myProperty}")
private String propertyValue;
@PostConstruct
public void init() {
this.propertyValue += "/SomeFileName.xls";
}
}
Une autre façon serait d'utiliser une @Autowired
config-method. De documentation :
Marque un constructeur, un champ, une méthode de définition ou une méthode de configuration comme étant auto-câblé par les centres d’injection de dépendance de Spring.
...
Les méthodes de configuration peuvent avoir un nom arbitraire et un nombre quelconque d'arguments; chacun de ces arguments sera automatiquement associé à un bean correspondant dans le fichier Conteneur à ressort. Les méthodes de définition de propriété de bean sont en réalité juste un cas particulier d’une telle méthode de configuration générale. De telles méthodes de configuration font ne pas avoir à être public.
Exemple:
public class MyService {
private String propertyValue;
@Autowired
public void initProperty(@Value("${myProperty}") String propertyValue) {
this.propertyValue = propertyValue + "/SomeFileName.xls";
}
}
La différence réside dans le fait qu’avec la deuxième approche, vous n’aurez pas d’accroche supplémentaire dans votre bean, vous l’adaptez à la transmission automatique.
Vous pouvez utiliser @Value pour lire les valeurs à partir de fichiers de propriétés, ce qui ressemble davantage à quelque chose que vous souhaitez atteindre.
Si vous configurez PropertySourcesPlaceholderConfigurer dans la méthode de configuration xml ou bean, la valeur sera définie au printemps pour vous.
@Value("${server.env}")
private String serverEnv;
Et la configuration ....
@Configuration
public class Cfg {
@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
final PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
propertySourcesPlaceholderConfigurer.setLocation(new ClassPathResource("/foo.properties"));
return propertySourcesPlaceholderConfigurer;
}
}
ou l'approche xml
<context:property-placeholder location="classpath*:foo.properties"/>