Foråret @Qualifier-kommentar

1. Oversigt

I denne artikel undersøger vi hvad @Kvalifikator kommentar kan hjælpe os med, hvilke problemer det løser, og hvordan man bruger det.

Vi forklarer også, hvordan det adskiller sig fra @Primær kommentar og fra automatisk ledningsføring ved navn.

2. Autowire-behov for tvetydiggørelse

Det @Autowired annotering er en fantastisk måde at gøre behovet for at indsprøjte en afhængighed i foråret eksplicit. Og selvom det er nyttigt, er der brugstilfælde, hvor denne kommentar alene ikke er nok for foråret til at forstå, hvilken bønne der skal injiceres.

Som standard løser Spring autowired-poster efter type.

Hvis der er mere end en bønne af samme type i containeren, kaster rammen NoUniqueBeanDefinitionException, hvilket indikerer, at der er mere end en bønne til rådighed til autokabler.

Lad os forestille os en situation, hvor der findes to mulige kandidater til Spring til at injicere som bønnesamarbejdere i en given instans:

@Component ("fooFormatter") offentlig klasse FooFormatter implementerer Formatter {public String format () {return "foo"; }} @Component ("barFormatter") offentlig klasse BarFormatter implementerer Formatter {public String format () {return "bar"; }} @Komponent offentlig klasse FooService {@Autowired privat formater formater; }

Hvis vi prøver at indlæse FooService i vores sammenhæng kaster forårets ramme en NoUniqueBeanDefinitionException. Dette er fordi Foråret ved ikke, hvilken bønne der skal injiceres. For at undgå dette problem er der flere løsninger. Det @Kvalifikator kommentar er en af ​​dem.

3. @Kvalifikator Kommentar

Ved hjælp af @Kvalifikator kommentar, det kan vi eliminere spørgsmålet om, hvilken bønne der skal injiceres.

Lad os se på vores tidligere eksempel og se, hvordan vi løser problemet ved at inkludere @Kvalifikator kommentar for at angive, hvilken bønne vi vil bruge:

offentlig klasse FooService {@Autowired @Qualifier ("fooFormatter") privat formateringsformater; }

Ved at inkludere @Kvalifikator kommentar sammen med navnet på den specifikke implementering, vi vil bruge - i dette eksempel Foo - vi kan undgå tvetydighed, når Spring finder flere bønner af samme type.

Vi er nødt til at tage i betragtning, at det kvalificeringsnavn, der skal bruges, er det, der er angivet i @Komponent kommentar.

Bemærk, at vi også kunne have brugt @Kvalifikator kommentar på Formater implementere klasser i stedet for at specificere navnene i deres @Komponent annoteringer for at opnå den samme effekt:

@Component @Qualifier ("fooFormatter") offentlig klasse FooFormatter implementerer Formatter {// ...} @Component @Qualifier ("barFormatter") offentlig klasse BarFormatter implementerer Formatter {// ...} 

4. @Kvalifikator vs. @Primær

Der er en anden kommentar kaldet @Primær som vi kan bruge til at beslutte, hvilken bønne vi skal injicere, når der er tvetydighed om afhængighedsinjektion.

Denne kommentar definerer en præference, når der findes flere bønner af samme type. Bønnen forbundet med @Primær annotering bruges, medmindre andet er angivet.

Lad os se et eksempel:

@Configuration public class Config {@Bean public Employee johnEmployee () {returner ny medarbejder ("John"); } @Bean @Primary offentlig ansat tonyEmployee () {returner ny medarbejder ("Tony"); }}

I dette eksempel returnerer begge metoder ens Medarbejder type. Bønnen, som Spring vil injicere, er den, der returneres ved metoden tony medarbejder. Dette skyldes, at den indeholder @Primær kommentar. Denne kommentar er nyttig, når vi vil angiv hvilken bønne af en bestemt type, der skal injiceres som standard.

Og hvis vi har brug for den anden bønne ved et eller andet injektionssted, skal vi specifikt angive det. Det kan vi gøre via @Kvalifikator kommentar. For eksempel kunne vi specificere, at vi vil bruge den bønne, der returneres af johnMedarbejder metode ved hjælp af @Kvalifikator kommentar.

Det er værd at bemærke det hvis begge @Kvalifikator og @Primær kommentarer er til stede, så er @Kvalifikator annotering har forrang. I bund og grund, @Primær definerer en standard, mens @Kvalifikator er meget specifik.

Lad os se en anden måde at bruge @Primær kommentar, denne gang ved hjælp af det oprindelige eksempel:

@Component @Primary public class FooFormatter implementerer Formatter {// ...} @Component public class BarFormatter implementerer Formatter {// ...} 

I dette tilfælde er @Primær annotering placeres i en af ​​de implementerende klasser og vil tydeliggøre scenariet.

5. @Kvalifikator vs Autowiring efter navn

En anden måde at vælge mellem flere bønner ved automatisk ledningsføring er ved at bruge navnet på marken til at injicere. Dette er standard, hvis der ikke er andre tip til foråret. Lad os se noget kode baseret på vores oprindelige eksempel:

offentlig klasse FooService {@Autowired privat formater fooFormatter; }

I dette tilfælde vil Spring bestemme, at bønnen, der skal injiceres, er FooFormatter en, da feltnavnet matches med den værdi, vi brugte i @Komponent kommentar til den bønne.

6. Konklusion

Vi har beskrevet de scenarier, hvor vi har brug for at tydeliggøre, hvilke bønner der skal injiceres. Især beskrev vi @Kvalifikator kommentar og sammenlignede den med andre lignende måder at bestemme, hvilke bønner der skal bruges.

Som sædvanlig er den komplette kode til denne artikel tilgængelig på GitHub.