Anotácia Spring @Qualifier

1. Prehľad

V tomto článku to preskúmame čo @Qualifier anotácia nám môže pomôcť, ktoré problémy rieši a ako ich používať.

Vysvetlíme tiež, v čom sa líši od @Primárny anotácie a z automatického zapojenia podľa názvu.

2. Potreba autowire pre disambiguáciu

The @Autowired anotácia je vynikajúci spôsob, ako explicitne uviesť potrebu vložiť závislosť do jari. A hoci je to užitočné, existujú prípady použitia, pre ktoré samotná táto anotácia nestačí na to, aby Spring pochopil, ktoré fazuľa má vstreknúť.

V predvolenom nastavení Spring rozlišuje položky s automatickým pripojením podľa typu.

Ak je v kontajneri k dispozícii viac ako jedna fazuľa rovnakého typu, rámec vyhodí NoUniqueBeanDefinitionException, čo naznačuje, že pre automatické napájanie je k dispozícii viac ako jedna fazuľa.

Poďme si predstaviť situáciu, v ktorej existujú dvaja možní kandidáti na to, aby Spring v danom prípade nastúpil ako fazuľový spolupracovník:

@Component ("fooFormatter") verejná trieda FooFormatter implementuje Formatter {public String format () {return "foo"; }} @Component ("barFormatter") verejná trieda BarFormatter implementuje Formatter {public String format () {return "bar"; }} @ Verzia komponentu FooService {@Autowired private Formatter formatter; }

Ak sa pokúsime načítať FooService do nášho kontextu vrhne jarný rámec a NoUniqueBeanDefinitionException. To je preto, že Jar nevie, do ktorej fazule si má dať injekciu. Aby sa zabránilo tomuto problému, existuje niekoľko riešení. The @Qualifier anotácia je jednou z nich.

3. @Qualifier Anotácia

Použitím @Qualifier anotáciu, môžeme vylúčiť problém, do ktorého je potrebné podať fazuľu.

Zopakujme si náš predchádzajúci príklad a pozrime sa, ako vyriešime problém zahrnutím @Qualifier anotácia označujúca, ktorú fazuľu chceme použiť:

public class FooService {@Autowired @Qualifier ("fooFormatter") private Formatter formatter; }

Zahrnutím @Qualifier anotáciu spolu s názvom konkrétnej implementácie, ktorú chceme použiť - v tomto príklade Foo - môžeme sa vyhnúť nejednoznačnosti, keď Spring nájde viac fazúľ rovnakého typu.

Musíme vziať do úvahy, že názov kvalifikátora, ktorý sa má použiť, je ten, ktorý je uvedený v @ Komponent anotácia.

Všimnite si, že sme mohli použiť aj @Qualifier anotácia k Formátovač implementujúce triedy, namiesto toho, aby vo svojich @ Komponent anotácií, aby sa dosiahol rovnaký efekt:

@Component @Qualifier ("fooFormatter") verejná trieda FooFormatter implementuje Formatter {// ...} @Component @Qualifier ("barFormatter") verejná trieda BarFormatter implementuje Formatter {// ...} 

4. @Qualifier vs @Primárny

Nazýva sa ďalšia anotácia @Primárny ktoré môžeme použiť na rozhodnutie, ktorú fazuľu vložiť, keď je tu nejednoznačnosť ohľadne injekcie závislostí.

Táto anotácia definuje preferenciu, keď je prítomných viac fazúľ rovnakého typu. Fazuľa spojená s @Primárny použije sa anotácia, pokiaľ nie je uvedené inak.

Pozrime sa na príklad:

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

V tomto príklade obidve metódy vracajú rovnaké Zamestnanec typu. Fazuľa, ktorú Spring vpichne, je tá, ktorá sa vrátila metódou tonyZamestnanec. Je to preto, lebo obsahuje @Primárny anotácia. Táto anotácia je užitočná, keď chceme určiť, ktorá fazuľa určitého typu sa má štandardne vložiť.

A v prípade, že v určitom bode vstrekovania požadujeme druhú fazuľu, budeme ju musieť osobitne označiť. Môžeme to urobiť prostredníctvom @Qualifier anotácia. Mohli by sme napríklad určiť, že chceme použiť fazuľu vrátenú parametrom johnZamestnanec metóda pomocou @Qualifier anotácia.

Stojí za zmienku, že ak obaja @Qualifier a @Primárny sú prítomné anotácie, potom @Qualifier anotácia bude mať prednosť. V podstate @Primárny definuje predvolené, zatiaľ čo @Qualifier je veľmi konkrétny.

Pozrime sa na ďalší spôsob použitia @Primárny anotácie, tentokrát s použitím počiatočného príkladu:

@Component @Primary verejná trieda FooFormatter implementuje formátovač {// ...} @Component verejná trieda BarFormatter implementuje formátovač {// ...} 

V takom prípade @Primárny anotácia je umiestnená v jednej z implementujúcich tried a rozvedie scenár.

5. @Qualifier vs Autowiring podľa názvu

Ďalším spôsobom, ako sa rozhodnúť medzi viacerými fazuľami pri automatickom zapojení, je použitie názvu poľa na injekciu. Toto je predvolené nastavenie v prípade, že pre Spring neexistujú žiadne ďalšie tipy. Pozrime sa na nejaký kód založený na našom počiatočnom príklade:

verejná trieda FooService {@Autowired private Formatter fooFormatter; }

V takom prípade Spring určí, že fazuľa, ktorá sa má vpichnúť, je FooFormatter jeden, pretože názov poľa sa zhoduje s hodnotou, ktorú sme použili v @ Komponent anotácia k tej fazuli.

6. Záver

Popísali sme scenáre, v ktorých je potrebné nejednoznačne určiť, ktoré fazule si máme vpichnúť. Opísali sme najmä: @Qualifier anotáciu a porovnal ju s inými podobnými spôsobmi, ako určiť, ktoré fazule je potrebné použiť.

Úplný kód tohto článku je ako obvykle k dispozícii na serveri GitHub.


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