web-dev-qa-db-fra.com

Quel est l'ordre de priorité lorsqu'il existe plusieurs profils d'environnement Spring définis par spring.profiles.active

Je me demande simplement ce que l'ordre de priorité est lorsque plusieurs profils actifs Spring ont été spécifiés.

Disons que je veux que le profil default soit actif mais que le profil dev le remplace lorsqu'il y a plusieurs éléments identiques (beans par exemple) à choisir mais avec des profils différents ...

Disons par exemple que j'ai deux PropertySourcesPlaceholderConfigurer beans configurés avec "default" et "dev" valorise un profil d'environnement.

Si j'utilise l'activation de profil suivante: -Dspring.profiles.active="default,dev"

Le profil dev remplacera-t-il celui default?

Sinon, comment le comportement ci-dessus peut-il être atteint?

27
balteo

L'ordre des profils dans le spring.profiles.active la propriété système n'a pas d'importance. La "priorité" est définie par l'ordre de déclaration des beans, y compris les beans spécifiques à un profil, et la dernière définition de bean gagne.

En utilisant votre exemple, si -Dspring.profiles.active="default,dev" est utilisé, le bean props dans le profil default serait utilisé ici, simplement parce que c'est la dernière définition active de ce bean:

<beans profile="dev">
    <bean id="props" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="location" value="classpath:META-INF/dev.properties"/>
    </bean>
</beans>
<beans profile="default">
    <bean id="props" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="location" value="classpath:META-INF/default.properties"/>
    </bean>
</beans>

Inversez l'ordre des beans, puis la version dev serait utilisée, quelle que soit la façon dont les profils sont ordonnés dans spring.profiles.active.

Notez que je n'ai pas utilisé <context:property-placeholder/> car il ne vous permet pas de spécifier explicitement un identifiant de bean, et je ne suis donc pas sûr du comportement qu'il présenterait si plusieurs étaient utilisés. J'imagine que les propriétés seraient fusionnées, de sorte que les propriétés définies par les deux utiliseraient la dernière définition, mais les propriétés spécifiques à chaque fichier resteraient intactes.

Sinon, d'après mon expérience, vous définiriez généralement les beans dans cet ordre:

  1. Définitions de bean "par défaut", non spécifiques à un profil
  2. Remplacement des définitions de bean dans un profil spécifique à l'environnement
  3. Remplacement des définitions de bean dans un profil spécifique au test

De cette façon, les beans de profil de test gagneraient s'ils étaient utilisés en combinaison avec d'autres profils; sinon, vous utiliserez soit des beans spécifiques à l'environnement, soit des beans par défaut basés sur le profil.

17
superEb

superEB a raison, l'ordre des profils n'a pas d'importance pour les beans, l'ordre de déclaration y est plus important, mais gardez à l'esprit que l'ordre est important si vous utilisez des fichiers de configuration basés sur des profils!

3