web-dev-qa-db-fra.com

Ordre de configuration dans Spring Boot

J'essaie de comprendre comment les beans que nous fabriquons avec @Configuration ont tendance à remplacer les beans générés par SpringBoot par défaut. J'ai travaillé sur un projet dans lequel, dans de nombreux cas, nous créons des beans pour des choses comme ZuulConfigs et l'hypothèse est que, quoi que nous fassions, la priorité sera celle sur le bean généré par défaut. J'ai essayé de comprendre cela mais je ne peux pas. Fondamentalement,

  1. Spring y parvient-il via un chargeur de classes personnalisé?
  2. Sinon, comment fonctionne cette priorité? Puis-je donner la priorité à mes haricots
  3. Puis-je générer une hiérarchie similaire dans mon projet, si oui, comment

L'aide est très appréciée

5
chinmay

Spring AutoConfiguration est utilisé pour fournir une configuration de base si certaines classes sont dans le classpath ou non.

Si vous voulez configurer l’ordre dans lequel les beans sont instanciés au printemps, vous pouvez utiliser

@DependsOn("A") 
 public class B {
 ...    
}

Cela créerait le haricot "A", puis "B". Par conséquent, vous pouvez commander la configuration en fonction des besoins en beans. Anyways Spring détecte automatiquement les dépendances en analysant les classes de bean . Pour plus d’aide, consultez cette question Ordre de configuration automatique de démarrage de printemps

Alternative: Il existe également une annotation "@AutoConfigureOrder" (où vous pouvez hiérarchiser la configuration), vous pouvez consulter le code pour une meilleure compréhension.

La documentation de la configuration automatique est here

3
virsha

Tout d’abord, le chargement des classes et la création de beans sont deux choses différentes. Nous n'avons pas besoin de créer un bean pour charger une classe, cependant, une classe doit être chargée pour créer un bean.

Revenons maintenant à l'exemple de Spring. Spring examine tous les packages configurés par @componentScan et crée des beans de toutes les classes annotées avec @Bean, @Configuration et/ou @Component. Le conteneur de Spring garde la trace de tous les beans créés et par conséquent, lorsqu'il rencontre un bean défini par l'utilisateur avec le même nom et le même type de classe que le bean par défaut, il remplace la définition d'origine par celle définie par l'utilisateur (par exemple, nous pouvons créer notre @ObjectMapper personnalisé pour remplacer le propre exemple). Vous pouvez également utiliser l'annotation @Primary pour que votre bean soit prioritaire s'il existe une autre définition avec la même classe (documentation ici ). 

Voici les réponses à vos questions:

  1. Spring utilise la réflexion pour charger les classes et créer des instances. Bien que vous puissiez charger les classes avec votre chargeur de classes personnalisé (pour plus d'informations à ce sujet ici ), vous n'avez pas à vous en préoccuper pour @Configuration.
  2. Oui, vous pouvez utiliser l'annotation @Primary pour donner la priorité à votre bean. Vous pouvez également utiliser @Order ( here ) pour définir l’ordre de création de vos beans.
  3. Avec @Primary, @Order et @Qualifierannotation vous pouvez définir votre propre hiérarchie pour la création de beans.
2
Darshan Mehta

Sachez simplement ceci: les classes de configuration automatique Spring Boot (en particulier) sont toujours configurées last. Une fois que tous les beans utilisateur ont été créés. Les classes de configuration automatique Spring Boot utilisent presque toujours les annotations @ConditionalXXXX pour s'assurer que tous les beans du même type/nom et les autres conditions configurées dans votre application auront priorité sur les beans Spring Boot configurés automatiquement .

1
Strelok

Si vous souhaitez que votre @Component ait priorité sur un autre @Component lors de l'analyse de tous les composants au printemps, utilisez @Order (Ordered.LOWEST_PRECEDENCE), c'est-à-dire la valeur maximale pour charger votre composant par-dessus un autre.

@Primary est utilisé pour donner à votre bean une préférence par défaut, nous pouvons remplacer la préférence par défaut en utilisant @Qualifier

0
Shruti Gupta