Spring @Primary Annotation
1. Prehľad
V tomto rýchlom výučbe si povieme niečo o jarných @Primárny anotácia, ktorá bola uvedená do verzie 3.0 rámca.
Jednoducho povedané, používame @Primárny dať fazuľke vyššiu prednosť, ak existuje viac fazúľ rovnakého typu.
Popíšme si problém podrobne.
2. Prečo je @Primárny Potrebné?
V niektorých prípadoch, musíme zaregistrovať viac ako jednu fazuľu rovnakého typu.
V tomto príklade máme JohnEmployee () a TonyEmployee () fazuľa Zamestnanec typ:
@Configuration public class Config {@Bean public Employee JohnEmployee () {return new Employee ("John"); } @Bean public Employee TonyEmployee () {return new Employee ("Tony"); }}
Jarné hody NoUniqueBeanDefinitionException ak sa pokúsime aplikáciu spustiť.
Na prístup k fazuli rovnakého typu, aký obvykle používame @Qualifier („názov fazule“) anotácia.
Aplikujeme ho v mieste vpichu spolu s @Autowired. V našom prípade vyberieme fazuľu vo fáze konfigurácie tak @Qualifier tu nie je možné použiť. Môžeme sa dozvedieť viac o @Qualifier anotáciu kliknutím na odkaz.
Na vyriešenie tohto problému ponúka jar @Primárny anotácia.
3. Použite @Primárny S @Bean
Poďme sa pozrieť na konfiguračnú triedu:
@Configuration public class Config {@Bean public Employee JohnEmployee () {return new Employee ("John"); } @Bean @Primary public Employee TonyEmployee () {return new Employee ("Tony"); }}
Označíme TonyEmployee () fazuľa s @Primárny. Jar vstrekne TonyEmployee () fazuľa prednostne pred JohnEmployee ().
Teraz začnime kontext aplikácie a získajme Zamestnanec fazuľa z toho:
AnnotationConfigApplicationContext context = nový AnnotationConfigApplicationContext (Config.class); Zamestnanec zamestnanec = context.getBean (Employee.class); System.out.println (zamestnanec);
Po spustení aplikácie:
Zamestnanec {name = 'Tony'}
Z výstupu vidíme, že TonyEmployee () inštancia má prednosť pri automatickom zapojení.
4. Použite @Primárny S @ Komponent
@Primary môžeme použiť priamo na fazuľu. Pozrime sa na nasledujúci scenár:
manažér verejného rozhrania {String getManagerName (); }
Máme Manažér rozhranie a dve podtriedy fazule, DepartmentManager:
@Component public class DepartmentManager implementuje Manager {@Override public String getManagerName () {return "Department manager"; }}
A Generálny riaditeľ fazuľa:
@Component @Primary verejná trieda GeneralManager implementuje Manager {@Override public String getManagerName () {return "General manager"; }}
Oba majú prednosť pred getManagerName () z Manažér rozhranie. Upozorňujeme tiež, že označujeme Generálny riaditeľ fazuľa s @Primárny.
Tentokrát, @Primárny má zmysel iba vtedy, keď povolíme skenovanie komponentov:
@Configuration @ComponentScan (basePackages = "org.baeldung.primary") konfigurácia verejnej triedy {}
Poďme vytvoriť službu na použitie vkladania závislostí pri hľadaní správneho fazule:
@Service verejná trieda ManagerService {@Autowired private Manager manager; public Manager getManager () {návratový manažér; }}
Tu obe fazule DepartmentManager a Generálny riaditeľ majú nárok na automatické zapojenie.
Ako sme označili Generálny riaditeľ fazuľa s @Primárny, bude vybraný pre vkladanie závislostí:
Služba ManagerService = context.getBean (ManagerService.class); Manažér manažér = service.getManager (); System.out.println (manager.getManagerName ());
Výstup je „Generálny riaditeľ".
5. Záver
V tomto článku sme sa dozvedeli niečo o jarných @Primárny anotácia. Na príkladoch kódu sme demonštrovali potrebu a prípady použitia @Primárny.
Úplný kód tohto článku je ako obvykle k dispozícii na webe GitHub.