Printemps: Comment le faire ET dans les Profils?
Printemps Profil annotation vous permet de sélectionner des profils. Toutefois, si vous lisez la documentation, il ne vous permet de sélectionner plus d'un profil OU d'une opération. Si vous spécifiez @Profil("A", "B") puis votre bean sera si Un profil ou profil B est active.
Notre cas est différent, nous voulons soutenir les TEST et PROD versions de multiples configurations. Donc parfois, nous voulons autowire le haricot seulement si les deux profils de TEST et CONFIG1 sont actifs.
Est-il un moyen de le faire avec le Printemps? Quelle serait la façon la plus simple?
- bien dans les docs sa mentionnés comme
and/or
comportement pour@Profile("a","b")
. N'est-ce pas ce que vous recherchez? docs -Likewise, if a @Component or @Configuration class is marked with @Profile({"p1", "p2"}), that class will not be registered/processed unless profiles 'p1' and/or 'p2' have been activated.
- ce qui signifie qu'il est l'opérateur "or" et non pas "ET". Ils ont juste voulu préciser explicitement qu'il n'est pas ou-exclusif (xor)
- J'ai ouvert un ticket pour le Printemps de la Source à l'appui "ET" opérateur de Profil annotation: jira.printemps.io/parcourir/SPR-12458
- okies. permet de voir ce qui ressort de l'équipe a à dire.
- Ils ont accepté le billet et, apparemment, va le faire à un certain point.
Vous devez vous connecter pour publier un commentaire.
Depuis le Printemps ne fournit pas le ET la fonctionnalité de la sortie de la boîte. Je dirais que la stratégie suivante:
Actuellement
@Profile
annotation a une condition d'annotation@Conditional(ProfileCondition.class)
. DansProfileCondition.class
il parcourt les profils et vérifie si le profil est actif. De même, vous pouvez créer votre propre conditionnelle de mise en œuvre et de limiter l'enregistrement de la fève. par exemple,Dans votre classe:
REMARQUE: je n'ai pas vérifié pour tous les cas de coin (comme null, vérifications de longueur, etc). Mais, cette orientation pourrait aider.
Depuis le Printemps 5.1 (incorporé au Printemps de Démarrage 2.1) il est possible d'utiliser un profil d'expression à l'intérieur du profil de la chaîne d'annotation. Donc:
Dans Printemps 5.1 (Printemps Boot 2.1) et au-dessus de c'est aussi simple que:
Printemps 4.x et 5.0.x:
Approche 1: répondu par @Mithun, il couvre parfaitement votre cas de conversion OU de dans ET dans votre profil d'annotation lorsque vous annotez le Printemps Bean aussi avec son
Condition
implémentation de la classe. Mais je tiens à offrir une autre approche que personne n'a proposé que a ses avantages et les inconvénients de.Approche 2:
Utilisez simplement
@Conditional
et de créer autant deCondition
implémentations de combinaisons nécessaires. Il a la con de devoir créer autant d'implémentations de combinaisons, mais si vous n'avez pas beaucoup de combinaisons, à mon avis, il est plus concis solution et il offre plus de flexibilité et la possibilité de mettre en œuvre plus complexe logique des résolutions.La mise en œuvre de Approche 2 serait comme suit.
Votre Printemps Bean:
TestAndConfig1Profiles
mise en œuvre:Avec cette approche que l'on pourrait facilement couvrir de plus en plus complexe de la logique des situations comme par exemple:
(TEST & CONFIG1) | (TEST & CONFIG3)
Voulais juste donner une mise à jour de la réponse à votre question et de compléter d'autres réponses.
Un peu amélioré la version de @Mithun réponse:
A pas pu le poster dans les commentaires.
Encore une autre option est de jouer sur la Classe/niveau de la Méthode autorisée par la
@Profile
annotation. Pas aussi souple que la mise en œuvre deMyProfileCondition
mais rapide et propre si elle convient à votre cas.par exemple, ce ne démarre pas lorsque la FAST & DEV sont à la fois actif, mais si seulement DEV est:
J'ai amélioré @rozhoc de réponse étant donné que la réponse n'a pas en compte le fait qu'aucun profil n'est équivalent à "par défaut" quand il s'agit de l'aide de @Profil. Aussi, les conditions que je voulais étaient
!default && !a
qui @rozhoc code ne gère pas correctement. Enfin j'ai utilisé certains Java8, et montrer seulement lematches
méthode pour des raisons de concision.Ici est de savoir comment vous comptez l'utiliser dans le cas qui a été source de confusion et:
Si vous avez déjà marqué d'une classe de configuration ou de méthode d'haricot avec @Profil d'annotation, il est simple de vérifier pour d'autres profils (par exemple, pour ET de l'état) avec
Environment.acceptsProfiles()
Un autre genre de truc mais peuvent travailler dans de nombreux scénarios est mis @Profil annotation @Configuration et l'autre @Profil sur @Bean - qui crée de la logique ET entre les 2 profils en java printemps config.