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?
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".
@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.
@ 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
.
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
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.