web-dev-qa-db-fra.com

Différence entre @Primary et @Autowired avec des annotations @Qualifier

Donc, si j'ai bien compris, les deux sont le moyen de déterminer le bean à câbler automatiquement s'il y a plusieurs candidats. Alors, quelle est exactement la différence?

15
Maciaz

Lis @Primary comme "valeur par défaut".

Si un bean a @Autowired sans aucun @Qualifier, et plusieurs beans du type existent, le bean candidat marqué @Primary sera choisi, c'est-à-dire qu'il s'agit de la sélection par défaut lorsqu'aucune autre information n'est disponible, c'est-à-dire lorsque @Qualifier est manquant.

Un bon cas d'utilisation est qu'au départ, vous n'aviez qu'un seul bean du type, donc aucun du code utilisé @Qualifier. Lorsque vous ajoutez ensuite un autre bean, vous ajoutez également @Qualifier à l'ancien et au nouveau bean, donc tout @Autowired peut choisir celle qu'il veut. En ajoutant également @Primary à l'ancien bean d'origine, vous n'avez pas besoin d'ajouter @Qualifier à tous les @Autowired. Ils ont des droits acquis, pour ainsi dire.

@Primary est également bon si par ex. 95% de @Autowired veut un bean particulier. De cette façon, seul le @Autowired qui souhaite que le ou les autres bean (s) doivent spécifier @Qualifier. De cette façon, vous disposez de beans principaux que tous les câblés automatiques souhaitent, et @Qualifier n'est utilisé que pour demander un bean "alternatif".

26
Andreas

@Qualifier doit être utilisé conjointement avec @Autowired toujours. Cela indiquera le nom du bean qui doit être câblé automatiquement en cas de présence de plusieurs beans de même type dans le contexte de l'application (afin que Spring puisse effectuer automatiquement le câblage par nom).

@Primary doit être utilisé conjointement avec @Bean/@Autowired qui indique quel bean doit être privilégié, lorsqu'il y a plusieurs beans du même type.

L'un des cas d'utilisation classiques où vous utiliseriez @Primary est lorsque le framework (exemple spring-data) attend un bean d'un certain type (exemple EntityManager) mais que vous avez plusieurs sources de données et que vous auriez configuré plusieurs Entity Managers. Dans ces cas @Qualifier n'aide pas vraiment.

6
pvpkiran

@ Qualifier

S'il existe plusieurs instances disponibles pour un point d'injection, nous pouvons utiliser @Qualifier annotation pour résoudre une ambiguïté. Comme @Qualifier est utilisé au point d'injection, il peut y avoir deux situations où nous ne voulons pas ou ne pouvons pas utiliser @Qualifier.

  1. Lorsque le mode de câblage automatique est Autowire.BY_TYPE. Bien sûr, nous ne pouvons pas utiliser @Qualifier parce que nous n'avons pas de point d'injection défini par l'utilisateur spécifié comme @Autowired ou @Inject
  2. Nous voulons faire une sélection de bean (c'est-à-dire résoudre l'ambiguïté) au moment de la configuration plutôt que pendant le temps de développement des beans.

La solution aux problèmes ci-dessus consiste à utiliser @Primary annotation.

@ Primaire

Cela indique qu'un bean particulier doit avoir la préférence lorsque plusieurs beans sont candidats pour être câblés automatiquement à une dépendance à valeur unique. S'il existe exactement un bean "primaire" parmi les candidats, ce sera la valeur auto-câblée.

5
rimonmostafiz