web-dev-qa-db-fra.com

Comment utiliser l'annotation Spring @Value dans les variables de niveau classe

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.

13
Paramesh Korrakuti

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.

18
Francisco Spaeth

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"/>
0
msduk