Bilješka Spring @Qualifier

1. Pregled

U ovom ćemo članku istražiti što @Kvalifikator anotacija nam može pomoći u, koje probleme rješava i kako ih koristiti.

Također ćemo objasniti kako se razlikuje od @ Primarno napomena i iz automatskog ožičenja imenom.

2. Potreba automatskog povezivanja za uklanjanje višeznačnosti

The @Autowired anotacija je izvrstan način za eksplicitnu potrebu za ubrizgavanjem ovisnosti u Proljeće. I premda je korisno, postoje slučajevi upotrebe za koje samo ova napomena nije dovoljna da Spring shvati koji grah treba ubrizgati.

Prema zadanim postavkama Spring rješava automatski ožičene unose prema vrsti.

Ako je u spremniku dostupno više zrna iste vrste, okvir će baciti NoUniqueBeanDefinitionException, što znači da je za automatsko povezivanje dostupno više graha.

Zamislimo situaciju u kojoj postoje dva moguća kandidata za proljeće koji će ubrizgati kao suradnici u zrnu u datom primjeru:

@Component ("fooFormatter") javna klasa FooFormatter implementira Formatter {format javnog niza () {return "foo"; }} @Component ("barFormatter") javna klasa BarFormatter implementira Formatter {public String format () {return "bar"; }} @Component javna klasa FooService {@Autowired private Formatter formatter; }

Ako pokušamo učitati FooService u naš kontekst, Spring Spring će baciti a NoUniqueBeanDefinitionException. Ovo je zbog Proljeće ne zna koji grah treba ubrizgati. Da biste izbjegli ovaj problem, postoji nekoliko rješenja. The @Kvalifikator anotacija je jedan od njih.

3. @Kvalifikator Bilješka

Korištenjem @Kvalifikator napomena, možemo eliminirati pitanje koji grah treba ubrizgati.

Ponovno posjetimo naš prethodni primjer i vidjet ćemo kako ćemo riješiti problem uključivanjem @Kvalifikator napomena koja označava koji grah želimo koristiti:

javna klasa FooService {@Autowired @Qualifier ("fooFormatter") private Formatter formatter; }

Uključivanjem @Kvalifikator napomena zajedno s nazivom određene implementacije koju želimo koristiti - u ovom primjeru, Foo - možemo izbjeći dvosmislenost kada Spring pronađe više graha iste vrste.

Moramo uzeti u obzir da će se koristiti naziv kvalifikatora koji je naveden u @Komponenta bilješka.

Imajte na umu da smo mogli koristiti i @Kvalifikator bilješka na Formatter implementiranje klasa, umjesto navođenja imena u njihovim @Komponenta bilješke, da bi se dobio isti učinak:

@Component @Qualifier ("fooFormatter") javna klasa FooFormatter provodi Formatter {// ...} @Component @Qualifier ("barFormatter") javna klasa BarFormatter provodi Formatter {// ...} 

4. @Kvalifikator nasuprot @ Primarno

Zove se još jedna napomena @ Primarno pomoću koje možemo odlučiti koji zrno ubrizgati kad je prisutna dvosmislenost u vezi s ubrizgavanjem ovisnosti.

Ova napomena definira preferenciju kada je prisutno više graha iste vrste. Grah povezan s @ Primarno napomena će se koristiti ako nije drugačije naznačeno.

Pogledajmo primjer:

@Configuration javna klasa Config {@Bean public Employee johnEfficiee () {return new Employee ("John"); } @Bean @Primary public Employee tonyE Employee () {return new Employee ("Tony"); }}

U ovom primjeru obje metode vraćaju isto Zaposlenik tip. Grah koji će Spring ubrizgati je onaj koji se vraća metodom tonyE Employee. To je zato što sadrži @ Primarno bilješka. Ova je napomena korisna kada to želimo odredite koji grah određene vrste treba zadati ubrizgati.

A u slučaju da trebamo drugi grah na nekom mjestu ubrizgavanja, trebamo ga posebno naznačiti. To možemo učiniti putem @Kvalifikator bilješka. Na primjer, mogli bismo odrediti da želimo koristiti grah koji je vratio johnE Employee metodom pomoću @Kvalifikator bilješka.

Vrijedno je to napomenuti ako oboje @Kvalifikator i @ Primarno prisutne su napomene, a zatim @Kvalifikator napomena će imati prednost. U osnovi, @ Primarno definira zadani, dok @Kvalifikator je vrlo specifična.

Pogledajmo još jedan način korištenja @ Primarno napomena, ovaj put koristeći početni primjer:

@Component @Primary javna klasa FooFormatter provodi Formatter {// ...} @Component javna klasa BarFormatter provodi Formatter {// ...} 

U ovom slučaju, @ Primarno napomena se stavlja u jedan od nastavnih razreda i razlučiti će scenarij.

5. @Kvalifikator vs Automatsko ožičenje imenom

Drugi način odlučivanja između više grahova prilikom automatskog ožičenja je upotreba imena polja za ubrizgavanje. To je zadana postavka u slučaju da nema drugih savjeta za proljeće. Pogledajmo neki kod zasnovan na našem početnom primjeru:

javna klasa FooService {@Autowired private Formatter fooFormatter; }

U tom će slučaju Spring odrediti da li je grah za ubrizgavanje FooFormatter jedan budući da se naziv polja podudara s vrijednošću koju smo koristili u @Komponenta napomena za taj grah.

6. Zaključak

Opisali smo scenarije u kojima moramo razdvojiti koji grah ubrizgati. Konkretno, opisali smo @Kvalifikator bilješku i usporedio je s drugim sličnim načinima utvrđivanja koji grah treba koristiti.

Kao i obično, cjeloviti kôd za ovaj članak dostupan je na GitHubu.