Configuration de projet avec Spring

Table des matières

  • 1. La configuration doit être spécifique à l'environnement
  • 2. Les fichiers .properties pour chaque environnement
  • 3. La configuration du ressort
  • 4. Définition de la propriété dans chaque environnement
  • 5. Test et Maven
  • 6. Aller plus loin
  • 7. Conclusion

1. La configuration doit être spécifique à l'environnement

La configuration doit être spécifique à l'environnement - c'est juste une réalité. Si ce n'était pas le cas, alors ce ne serait pas la configuration et nous coderions simplement les valeurs en dur dans le code.

Pour une application Spring, vous pouvez utiliser plusieurs solutions, des solutions simples aux alternatives ultra-flexibles et très complexes.

L'une des solutions les plus courantes et les plus simples est une utilisation flexible des fichiers de propriétés et la prise en charge des propriétés de première classe fournie par Spring.

À titre de preuve de concept, aux fins de cet article, nous examinerons un type spécifique de propriété: la configuration de la base de données. Il est parfaitement logique d'utiliser un type de configuration de base de données pour la production, un autre pour les tests et encore un autre pour un environnement de développement.

2. Les fichiers .properties pour chaque environnement

Commençons notre Proof of Concept - en définissant les environnements que nous voulons cibler:

  • Dev
  • Mise en scène
  • Production

Ensuite, créons 3 fichiers de propriétés - un pour chacun de ces environnements:

  • persistence-dev.properties
  • persistence-staging.properties
  • persistence-production.properties

Dans une application Maven typique, ceux-ci peuvent résider dans src / main / resources , mais où qu'ils soient, ils devront être disponibles sur le chemin de classe lorsque l'application est déployée.

Remarque importante: avoir tous les fichiers de propriétés sous contrôle de version rend la configuration beaucoup plus transparente et reproductible. Cela va à l'encontre du fait d'avoir les configurations sur le disque quelque part et de simplement pointer Spring vers elles.

3. La configuration du ressort

Au printemps, nous inclurons le fichier correct en fonction de l'environnement:

La même chose peut bien sûr être faite avec la configuration Java:

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

Cette approche permet la flexibilité d'avoir plusieurs fichiers * .properties à des fins spécifiques et ciblées . Par exemple - dans notre cas, la configuration Spring de persistance importe les propriétés de persistance - ce qui est parfaitement logique. La configuration de sécurité importerait les propriétés liées à la sécurité, etc.

4. Définition de la propriété dans chaque environnement

La guerre finale et déployable contiendra tous les fichiers de propriétés - pour la persistance, les trois variantes de persistance - *. Properties . Puisque les fichiers sont nommés différemment, il n'y a aucune crainte d'inclure accidentellement le mauvais. Nous allons mettre la envTarget variables et sélectionnez donc l'instance que nous voulons des multiples variantes existantes.

La variable envTarget peut être définie dans le système d'exploitation / l'environnement ou en tant que paramètre de la ligne de commande JVM:

-DenvTarget=dev

5. Test et Maven

Pour les tests d'intégration qui nécessitent l'activation de la persistance, nous allons simplement définir la propriété envTarget dans le pom.xml:

 org.apache.maven.plugins maven-surefire-plugin   h2_test   

Le fichier persistence-h2_test.properties correspondant peut être placé dans src / test / resources afin qu'il ne soit utilisé que pour les tests et ne soit pas inutilement inclus et déployé avec la war lors de l'exécution.

6. Aller plus loin

Il existe plusieurs façons d'intégrer une flexibilité supplémentaire dans cette solution si nécessaire.

Un de ces moyens consiste à utiliser un codage plus complexe pour les noms des fichiers de propriétés, en spécifiant non seulement l'environnement dans lequel ils doivent être utilisés, mais également plus d'informations (comme le fournisseur de persistance). Par exemple, nous pourrions utiliser les types de propriétés suivants: persistence-h2.properties , persistence-mysql.properties ou, encore plus spécifique: persistence-dev_h2.properties , persistence-staging_mysql.properties , persistence-production_amazonRDS.properties .

L'avantage d'une telle convention de dénomination - et ce n'est qu'une convention car rien ne change dans l'approche globale - est simplement la transparence. Il devient maintenant beaucoup plus clair ce que fait la configuration uniquement en regardant les noms:

  • persistence-dev_h2.properties : le fournisseur de persistance pour le dev environnement est un poids léger, basedonnées H2 en mémoire
  • persistence-staging_mysql.properties : le fournisseur de persistance de l'environnement de test est une instance MySQL
  • persistence-production_amazon_rds.propertie : le fournisseur de persistance de l'environnement de production est Amazon RDS

7. Conclusion

Cet article décrit une solution flexible pour effectuer une configuration spécifique à l'environnement dans Spring. Une solution alternative utilisant des profils peut être trouvée ici.

La mise en œuvre de la solution peut être trouvée dans le projet GitHub - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.