propriétés avec Spring et Spring Boot

propriétés avec Spring et Spring Boot

aperçu

Ce tutoriel va montrer comment configurer et utiliser les propriétés dans Spring via Java configuration et @PropertySource.

nous verrons également comment les propriétés fonctionnent dans Spring Boot.

pour en savoir plus:

Spring Expression Language Guide

cet article explore Spring Expression Language (SpEL), un langage d’expression puissant qui prend en charge l’interrogation et la manipulation de graphiques d’objets lors de l’exécution.,
Lire la suite →

configurer une application Web Spring Boot

certaines des configurations les plus utiles pour une application Spring Boot.
Lire la suite →

Guide de @ConfigurationProperties dans Spring Boot

un guide rapide et pratique de @ConfigurationProperties annotation dans Spring Boot.
Lire la suite →

enregistrer un fichier de propriétés via des Annotations

Spring 3.1 introduit également la nouvelle annotation @PropertySource comme un mécanisme pratique pour ajouter des sources de propriétés à l’environnement.,

Nous pouvons utiliser cette annotation en conjonction avec l’annotation @Configuration:

@Configuration@PropertySource("classpath:foo.properties")public class PropertiesWithJavaConfig { //...}

Une autre façon très utile d’enregistrer un nouveau fichier de propriétés est d’utiliser un espace réservé, ce qui nous permet de sélectionner dynamiquement le bon fichier lors de l’exécution:

@PropertySource({ "classpath:persistence-${envTarget:mysql}.properties"})...

2.1. Définition de plusieurs emplacements de propriétés

L’annotation @PropertySource peut être répétée selon les conventions Java 8., Par conséquent, si nous utilisons Java 8 ou supérieur, nous pouvons utiliser cette annotation pour définir plusieurs emplacements de propriétés:

bien sûr, nous pouvons également utiliser l’annotation @PropertySources et spécifier un tableau de @PropertySource. Cela fonctionne dans n’importe quelle version Java prise en charge, pas seulement dans Java 8 ou supérieur:

dans les deux cas, il convient de noter qu’en cas de collision de nom de propriété, la dernière source lue a priorité.,

utiliser/injecter des propriétés

injecter une propriété avec l’annotation @Value est simple:

@Value( "${jdbc.url}" )private String jdbcUrl;

Nous pouvons également spécifier une valeur par défaut pour la propriété:

@Value( "${jdbc.url:aDefaultUrl}" )private String jdbcUrl;

le nouveau PropertySourcesPlaceholderConfigurer ajouté dans Spring 3.1, résolvez les espaces réservés $ {}} dans les valeurs de propriété de définition de Bean et les annotations @value.,

enfin, nous pouvons obtenir la valeur d’une propriété en utilisant L’API de L’environnement:

@Autowiredprivate Environment env;...dataSource.setUrl(env.getProperty("jdbc.url"));

propriétés avec Spring Boot

avant d’entrer dans des options de configuration plus avancées pour les propriétés, passons un peu de temps à regarder les nouvelles propriétés

de manière générale, ce nouveau support implique moins de configuration par rapport au Spring standard, ce qui est bien sûr l’un des principaux objectifs de Boot.

4.1. application.,propriétés: le fichier de propriétés par défaut

Boot applique sa convention typique sur l’approche de configuration aux fichiers de propriétés. Cela signifie que nous pouvons simplement mettre une application.fichier de propriétés dans notre répertoire src / main / resources, et il sera détecté automatiquement. Nous pouvons ensuite injecter toutes les propriétés chargées à partir de celui-ci comme d’habitude.

donc, en utilisant ce fichier par défaut, nous n’avons pas besoin d’enregistrer explicitement une PropertySource ou même de fournir un chemin d’accès à un fichier de propriété.,

nous pouvons également configurer un fichier différent à l’exécution si nous en avons besoin, en utilisant une propriété d’environnement:

java -jar app.jar --spring.config.location=classpath:/another-location.properties

à partir de Spring Boot 2.3, nous pouvons également spécifier des emplacements génériques pour les fichiers de configuration.

Par exemple, nous pouvons définir le printemps.config.location property to config/*/:

java -jar app.jar --spring.config.location=config/*/

de cette façon, Spring Boot recherchera les fichiers de configuration correspondant au modèle de répertoire config/*/ en dehors de notre fichier jar. Cela est utile lorsque nous avons plusieurs sources de propriétés de configuration.

Depuis la version 2.4.,0, Spring Boot prend en charge l’utilisation de fichiers de propriétés multi-documents, de la même manière que YAML le fait par conception:

baeldung.customProperty=defaultValue#---baeldung.customProperty=overriddenValue

notez que pour les fichiers de propriétés, la notation à trois tirets est précédée d’un caractère de commentaire (#).

4.2. Fichier de propriétés spécifiques à l’environnement

Si nous devons cibler différents environnements, il existe un mécanisme intégré pour cela au démarrage.

nous pouvons simplement définir un environnement d’application.fichier de propriétés dans le répertoire src/main / resources, puis définissez un profil Spring avec le même nom d’environnement.,

par exemple, si nous définissons un environnement « staging”, cela signifie que nous devrons définir un profil staging, puis une application staging.propriété.

Ce fichier env sera chargé et aura priorité sur le fichier de propriétés par défaut. Notez que le fichier par défaut sera toujours chargé, c’est juste que lorsqu’il y a une collision de propriétés, le fichier de propriétés spécifique à l’environnement a la priorité.

4.3. Fichier de propriétés spécifiques au Test

Nous pourrions également avoir besoin d’utiliser différentes valeurs de propriété lorsque notre application est en cours de test.,

Spring Boot gère cela pour nous en regardant dans notre répertoire src/test / resources pendant un test. Encore une fois, les propriétés par défaut seront toujours injectables normalement, mais seront remplacées par celles-ci en cas de collision.

4.4. L’Annotation @ TestPropertySource

Si nous avons besoin d’un contrôle plus granulaire sur les propriétés de test, nous pouvons utiliser l’annotation @TestPropertySource.,

cela nous permet de définir des propriétés de test pour un contexte de test spécifique, en ayant priorité sur la propriété par défaut sources:

Si nous ne voulons pas utiliser un fichier, Nous pouvons spécifier des noms et des valeurs directement:

Nous pouvons également obtenir un effet similaire en utilisant l’argument properties de Propriétés hiérarchiques

Si nous avons des propriétés regroupées, nous pouvons utiliser l’annotation @ConfigurationProperties, qui mappera ces hiérarchies de propriétés dans des graphiques D’objets Java.,

prenons quelques propriétés utilisées pour configurer une connexion à une base de données:

database.url=jdbc:postgresql:/localhost:5432/instancedatabase.username=foodatabase.password=bar

puis utilisons l’annotation pour les mapper à un objet de base de données:

Spring Boot applique à nouveau sa convention sur l’approche de configuration, mappant automatiquement entre les noms de propriétés et leurs champs correspondants. Tout ce que nous devons fournir est le préfixe de propriété.

Si vous souhaitez approfondir les propriétés de configuration, consultez notre article détaillé.

4.6. Alternative: fichiers YAML

Spring prend également en charge les fichiers YAML.,

toutes les mêmes règles de nommage s’appliquent pour les fichiers de propriétés spécifiques au test, spécifiques à l’environnement et par défaut. La seule différence est l’extension de fichier et une dépendance sur la bibliothèque SnakeYAML étant sur notre chemin de classe.,

YAML est particulièrement utile pour le stockage hiérarchique de propriétés; le fichier de propriétés suivant:

database.url=jdbc:postgresql:/localhost:5432/instancedatabase.username=foodatabase.password=barsecret: foo

est synonyme du fichier YAML suivant:

database: url: jdbc:postgresql:/localhost:5432/instance username: foo password: barsecret: foo

Il convient également de mentionner que les fichiers YAML ne supportent pas l’annotation @ PropertySource, donc si nous avons besoin d’utiliser cette annotation, utilisation d’un fichier de propriétés.

un autre point remarquable est que dans la version 2.4.0 Spring Boot a changé la façon dont les propriétés sont chargées à partir de fichiers YAML multi-documents., Auparavant, l’ordre dans lequel ils ont été ajoutés était basé sur l’ordre d’activation du profil. Avec la nouvelle version, cependant, le cadre suit les mêmes règles de commande que nous avons indiquées précédemment pour .fichiers de propriétés; les propriétés déclarées plus bas dans le fichier remplaceront simplement celles plus élevées.

de plus, dans cette version, les profils ne peuvent plus être activés à partir de documents spécifiques au profil, ce qui rend le résultat plus clair et plus prévisible.

4.7. Importer des fichiers de Configuration supplémentaires

avant la version 2.4.,0, Spring Boot autorisé, y compris les fichiers de configuration supplémentaires à l’aide du ressort.config.emplacement et printemps.config.propriétés supplémentaires-emplacement, mais ils avaient certaines limitations. Par exemple, ils devaient être définis avant de démarrer l’application (en tant que propriétés d’environnement ou de système, ou en utilisant des arguments de ligne de commande) car ils étaient utilisés au début du processus.

dans la version mentionnée, nous pouvons utiliser le ressort.config.importer une propriété dans l’application.Propriétés ou application.fichier yml pour inclure facilement des fichiers supplémentaires., Cette propriété prend en charge quelques fonctionnalités intéressantes:

  • ajout de plusieurs fichiers ou répertoires
  • les fichiers peuvent être chargés à partir du chemin de classe ou d’un répertoire externe
  • indiquant si le processus de démarrage doit échouer si un fichier est introuvable, ou s’il s’agit d’un fichier facultatif
  • importation de fichiers sans extension

voyons un exemple valide:

Note: ici, nous avons formaté cette propriété en utilisant des sauts de ligne juste pour plus de clarté.

Spring traitera les importations comme un nouveau document inséré immédiatement en dessous de la déclaration d’importation.

4.8., Propriétés à partir des Arguments de ligne de commande

en plus d’utiliser des fichiers, nous pouvons passer des propriétés directement sur la ligne de commande:

java -jar app.jar --property="value"

Nous pouvons également le faire via les propriétés système, qui sont fournies avant la commande-jar plutôt qu’après:

java -Dproperty.name="value" -jar app.jar

4.9. Propriétés des Variables D’environnement

Spring Boot détectera également les variables d’environnement, les traitant comme des propriétés:

export name=valuejava -jar app.jar

4.10., Randomisation des valeurs de propriétés

Si nous ne voulons pas de valeurs de propriétés déterministes, nous pouvons utiliser RandomValuePropertySource pour randomiser les valeurs des propriétés:

random.number=${random.int}random.long=${random.long}random.uuid=${random.uuid}

4.11. Types supplémentaires de sources de propriété

Spring Boot prend en charge une multitude de sources de propriété, implémentant un ordre bien pensé pour permettre un remplacement raisonnable. Cela vaut la peine de consulter la documentation officielle, qui va plus loin que la portée de cet article.,

Configuration utilisant des Beans bruts — le PropertySourcesPlaceholderConfigurer

outre les méthodes pratiques d’obtenir des propriétés dans Spring, nous pouvons également définir et regiter manuellement le bean de configuration de propriété.

travailler avec PropertySourcesPlaceholderConfigurer nous donne un contrôle total sur la configuration, avec l’inconvénient d’être plus verbeux et la plupart du temps, inutile.,

voyons comment définir ce bean en utilisant la configuration Java:

Propriétés dans des contextes Parent-enfant

cette question revient encore et encore: que se passe-t-il lorsque notre application web a un contexte parent et un contexte enfant? Le contexte parent peut avoir des fonctionnalités de base et des beans communs, puis un (ou plusieurs) contextes enfants, contenant peut-être des beans spécifiques à la servlet.

dans ce cas, quelle est la meilleure façon de définir les fichiers de propriétés et de les inclure dans ces contextes? Et comment récupérer au mieux ces propriétés du printemps?

nous allons donner une ventilation simple.,

Si le fichier est défini dans le contexte Parent:

  • @Value travaux dans le contexte Enfant: OUI
  • @Value travaux dans le contexte Parent: OUI
  • l’environnement.getProperty dans le contexte enfant: Oui
  • environnement.getProperty dans le contexte Parent: OUI

Si le fichier est défini dans le contexte Enfant:

  • @Value travaux dans le contexte Enfant: OUI
  • @Value travaux dans le contexte Parent: NON
  • l’environnement.getProperty dans le contexte enfant: Oui
  • environnement.,getProperty dans le contexte Parent: no

Conclusion

Cet article a montré plusieurs exemples de travail avec des propriétés et des fichiers de propriétés au printemps.

Comme toujours, l’intégralité du code sauvegardant l’article est disponible sur GitHub.

Get a commencé avec le Printemps 5 et le Printemps de Démarrage 2, par l’intermédiaire de l’Apprendre Printemps cours:

>> COURS

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *