Un guide rapide de Spring @Value

Un guide rapide sur Spring @Value

1. Vue d'ensemble

Dans cet article rapide, nous allons àhave a look at the @Value Spring annotation.

Cette annotation peut être utilisée pour injecter des valeurs dans des champs dans des beans gérés par Spring et peut être appliquée au niveau du champ ou du paramètre constructeur / méthode.

Lectures complémentaires:

Qu'est-ce qu'un haricot de printemps?

Une explication rapide et pratique de ce qu’est un haricot printanier.

Read more

Utilisation de Spring @Value avec les valeurs par défaut

Un guide rapide et pratique pour définir les valeurs par défaut lors de l'utilisation de l'annotation @Value dans Spring.

Read more

2. Mise en place de l'application

Pour décrire différents types d'utilisation de cette annotation, nous devons configurer une classe de configuration d'application Spring simple.

Et naturellement,we’ll need a properties file pour définir les valeurs que nous voulons injecter avec l'annotation@Value. Et donc, nous devrons d'abord définir un@PropertySource dans notre classe de configuration - avec le nom du fichier de propriétés.

Définissons le fichier de propriétés:

value.from.file=Value got from the file
priority=Properties file
listOfValues=A,B,C

3. Exemples d'utilisation

En tant qu'exemple d'utilisation basique et la plupart du temps inutile, nous pouvons uniquement injecter une «valeur de chaîne» de l'annotation au champ:

@Value("string value")
private String stringValue;

L'utilisation de l'annotation@PropertySource nous permet de travailler avec les valeurs des fichiers de propriétés avec l'annotation@Value. Dans l'exemple suivant, nous obtenons“Value got from the file” affectés au champ:

@Value("${value.from.file}")
private String valueFromFile;

Nous pouvons également définir la valeur à partir des propriétés système avec la même syntaxe. Supposons que nous ayons défini une propriété système nomméesystemValue et examinons l'exemple suivant:

@Value("${systemValue}")
private String systemValue;

Des valeurs par défaut peuvent être fournies pour les propriétés qui pourraient ne pas être définies. Dans cet exemple, la valeur“some default” sera injectée:

@Value("${unknown.param:some default}")
private String someDefault;

Si la même propriété est définie en tant que propriété système et dans le fichier de propriétés, la propriété système sera appliquée.

Supposons que nous ayons une propriétépriority définie comme une propriété système avec la valeur“System property” et définie comme autre chose dans le fichier de propriétés. Dans le code suivant, la valeur serait“System property”:

@Value("${priority}")
private String prioritySystemProperty;

Parfois, nous devons injecter un tas de valeurs. Il serait pratique de les définir en tant que valeurs séparées par des virgules pour la propriété unique dans le fichier de propriétés ou en tant que propriété système et de les injecter dans un tableau. Dans la première section, nous avons défini des valeurs séparées par des virgules dans leslistOfValues du fichier de propriétés, donc dans l'exemple suivant, les valeurs du tableau seraient[“A”, “B”, “C”]:

@Value("${listOfValues}")
private String[] valuesArray;

4. Exemples avancés avec SpEL

Nous pouvons également utiliser des expressions SpEL pour obtenir la valeur. Si nous avons une propriété système nomméepriority,, sa valeur sera appliquée au champ dans l'exemple suivant:

@Value("#{systemProperties['priority']}")
private String spelValue;

Si nous n'avons pas défini la propriété système, la valeurnull sera attribuée. Pour éviter cela, nous pouvons fournir une valeur par défaut dans l'expression SpEL. Dans l'exemple suivant, nous obtenons la valeur“some default” pour le champ si la propriété système n'est pas définie:

@Value("#{systemProperties['unknown'] ?: 'some default'}")
private String spelSomeDefault;

De plus, nous pouvons utiliser une valeur de champ d'autres beans. Supposons que nous ayons un bean nommésomeBean avec un champsomeValue égal à10. Ensuite,10 sera affecté au champ dans cet exemple:

@Value("#{someBean.someValue}")
private Integer someBeanValue;

Nous pouvons manipuler les propriétés pour obtenir unList de valeurs. Dans l'exemple suivant, nous obtenons une liste des valeurs de chaîne A, B et C:

@Value("#{'${listOfValues}'.split(',')}")
private List valuesList;

5. Utilisation de@Value avecMaps

Nous pouvons également utiliser l'annotation@Value pour injecter une propriétéMap.

Tout d'abord, nous devons définir la propriété dans le formulaire\{key: ‘value' } dans notre fichier de propriétés:

valuesMap={key1: '1', key2: '2', key3: '3'}

Notez que les valeurs desMap doivent être entre guillemets simples.

Nous pouvons maintenant injecter cette valeur à partir du fichier de propriétés en tant queMap:

@Value("#{${valuesMap}}")
private Map valuesMap;

Si nous avons besoin deto get the value of a specific key dans lesMap, tout ce que nous avons à faire estadd the key’s name in the expression:

@Value("#{${valuesMap}.key1}")
private Integer valuesMapKey1;

Si nous ne savons pas si leMap contient une certaine clé, nous devons choisira safer expression that will not throw an exception but set the value to null lorsque la clé n’est pas trouvée:

@Value("#{${valuesMap}['unknownKey']}")
private Integer unknownMapKey;

On peut aussiset default values for the properties or keys that might not exist:

@Value("#{${unknownMap : {key1: '1', key2: '2'}}}")
private Map unknownMap;

@Value("#{${valuesMap}['unknownKey'] ?: 5}")
private Integer unknownMapKeyWithDefaultValue;

Map entries can also be filtered avant injection. Supposons que nous ayons besoin d'obtenir uniquement les entrées dont les valeurs sont supérieures à un:

@Value("#{${valuesMap}.?[value>'1']}")
private Map valuesMapFiltered;

On peut aussi utiliser l'annotation@Value versinject all current system properties:

@Value("#{systemProperties}")
private Map systemPropertiesMap;

6. Conclusion

Dans ce rapide didacticiel, nous avons examiné les différentes possibilités d'utilisation de l'annotation@Value avec des propriétés simples définies dans le fichier, avec des propriétés système et avec des propriétés calculées avec des expressions SpEL.

Comme toujours, l'exemple d'application est disponibleon GitHub project.