Våren @Qualifier-merknaden

1. Oversikt

I denne artikkelen vil vi utforske hva i @Kvalifiserende merknader kan hjelpe oss med, hvilke problemer den løser, og hvordan du bruker den.

Vi forklarer også hvordan det er forskjellig fra @Hoved kommentar og fra automatisk ledning etter navn.

2. Autowire Behov for disambiguation

De @Autowired kommentar er en fin måte å gjøre behovet for å injisere en avhengighet om våren eksplisitt. Og selv om det er nyttig, er det brukstilfeller der denne kommentaren ikke er nok for at Spring skal forstå hvilken bønne som skal injiseres.

Som standard løser Spring autowired oppføringer etter type.

Hvis mer enn en bønne av samme type er tilgjengelig i containeren, vil rammeverket kaste NoUniqueBeanDefinitionException, som indikerer at mer enn en bønne er tilgjengelig for automatisk ledning.

La oss forestille oss en situasjon der det eksisterer to mulige kandidater for våren til å injisere som bønnesamarbeidere i en gitt tilfelle:

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

Hvis vi prøver å laste FooService inn i vår sammenheng vil vårrammen kaste en NoUniqueBeanDefinitionException. Dette er fordi Våren vet ikke hvilken bønne som skal injiseres. For å unngå dette problemet er det flere løsninger. De @Kvalifiserende kommentar er en av dem.

3. @Kvalifiserende Kommentar

Ved å bruke @Kvalifiserende kommentar, det kan vi eliminere problemet med hvilken bønne som må injiseres.

La oss se på vårt forrige eksempel og se hvordan vi løser problemet ved å inkludere @Kvalifiserende kommentar for å indikere hvilken bønne vi vil bruke:

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

Ved å inkludere @Kvalifiserende kommentar sammen med navnet på den spesifikke implementeringen vi vil bruke - i dette eksemplet, Foo - vi kan unngå tvetydighet når Spring finner flere bønner av samme type.

Vi må ta i betraktning at navnet på kvalifiseringen som skal brukes, er det som er angitt i @Komponent kommentar.

Merk at vi også kunne ha brukt @Kvalifiserende kommentar på Formaterer implementere klasser, i stedet for å spesifisere navnene i deres @Komponent merknader, for å oppnå samme effekt:

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

4. @Kvalifiserende vs. @Hoved

Det heter en annen kommentar @Hoved som vi kan bruke til å bestemme hvilken bønne vi skal injisere når tvetydighet er tilstede angående avhengighetsinjeksjon.

Denne kommentaren definerer en preferanse når flere bønner av samme type er til stede. Bønnen assosiert med @Hoved merknader vil bli brukt med mindre annet er angitt.

La oss se et eksempel:

@Configuration public class Config {@Bean offentlig ansatt johnEmployee () {return new Employee ("John"); } @Bean @Primary public Employee tonyEmployee () {return new Employee ("Tony"); }}

I dette eksemplet returnerer begge metodene likt Ansatt type. Bønnen som våren vil injisere, er den som returneres etter metoden tonymedarbeider. Dette er fordi den inneholder @Hoved kommentar. Denne kommentaren er nyttig når vi vil spesifiser hvilken bønne av en bestemt type som skal injiseres som standard.

Og i tilfelle vi trenger den andre bønnen på et eller annet injeksjonspunkt, må vi spesifikt indikere den. Vi kan gjøre det via @Kvalifiserende kommentar. For eksempel kan vi spesifisere at vi vil bruke bønnen som returneres av johnMedarbeider metoden ved å bruke @Kvalifiserende kommentar.

Det er verdt å merke seg det hvis begge @Kvalifiserende og @Hoved merknader er til stede, så er @Kvalifiserende merknader vil ha forrang. I utgangspunktet, @Hoved definerer en standard, mens @Kvalifiserende er veldig spesifikk.

La oss se en annen måte å bruke @Hoved kommentar, denne gangen ved hjelp av det første eksemplet:

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

I dette tilfellet @Hoved merknader plasseres i en av implementeringsklassene og vil entydiggjøre scenariet.

5. @Kvalifiserende vs Autowiring etter navn

En annen måte å bestemme mellom flere bønner ved autolading er ved å bruke navnet på feltet for å injisere. Dette er standard i tilfelle det ikke er andre tips til våren. La oss se litt kode basert på vårt første eksempel:

offentlig klasse FooService {@Autowired private Formatter fooFormatter; }

I dette tilfellet vil våren bestemme at bønnen som skal injiseres er FooFormatter en siden feltnavnet er matchet med verdien vi brukte i @Komponent kommentar for den bønnen.

6. Konklusjon

Vi har beskrevet scenariene der vi trenger å tydeliggjøre hvilke bønner vi skal injisere. Spesielt beskrev vi @Kvalifiserende kommentar og sammenlignet den med andre lignende måter å bestemme hvilke bønner som må brukes.

Som vanlig er den komplette koden for denne artikkelen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found