Spring @Primary Annotation
1. Oversigt
I denne hurtige vejledning diskuterer vi forårets @Primær kommentar, der blev introduceret med version 3.0 af rammen.
Kort fortalt, vi bruger @Primær for at give en bønne højere præference, når der er flere bønner af samme type.
Lad os beskrive problemet detaljeret.
2. Hvorfor er @Primær Havde brug for?
I nogle tilfælde, vi har brug for at registrere mere end en bønne af samme type.
I dette eksempel har vi JohnMedarbejder () og TonyMedarbejder () bønner af Medarbejder type:
@Configuration public class Config {@Bean offentlig medarbejder JohnEmployee () {returner ny medarbejder ("John"); } @Bean offentlig ansat TonyEmployee () {returner ny medarbejder ("Tony"); }}
Forår kaster NoUniqueBeanDefinitionException hvis vi prøver at køre applikationen.
For at få adgang til bønner af samme type, som vi normalt bruger @Qualifier (“beanName”) kommentar.
Vi anvender det på injektionsstedet sammen med @Autowired. I vores tilfælde vælger vi bønnerne i konfigurationsfasen så @Kvalifikator kan ikke anvendes her. Vi kan lære mere om @Kvalifikator kommentar ved at følge linket.
For at løse dette problem tilbyder Spring @Primær kommentar.
3. Brug @Primær Med @Bønne
Lad os se på konfigurationsklassen:
@Configuration public class Config {@Bean offentlig medarbejder JohnEmployee () {returner ny medarbejder ("John"); } @Bean @Primary offentlig ansat TonyEmployee () {returner ny medarbejder ("Tony"); }}
Vi markerer TonyMedarbejder () bønne med @Primær. Foråret vil injicere TonyMedarbejder () bønne fortrinsvis over JohnMedarbejder ().
Lad os nu starte applikationskonteksten og hente den Medarbejder bønne fra det:
AnnotationConfigApplicationContext context = ny AnnotationConfigApplicationContext (Config.class); Medarbejdermedarbejder = context.getBean (Medarbejder.klasse); System.out.println (medarbejder);
Når vi har kørt applikationen:
Medarbejder {name = 'Tony'}
Fra output kan vi se, at TonyMedarbejder () instans har en præference under autokabler.
4. Brug @Primær Med @Komponent
Vi kan bruge @Primary direkte på bønnerne. Lad os se på følgende scenarie:
manager for offentlig grænseflade {String getManagerName (); }
Vi har en Manager interface og to underklassebønner, Afdelingsleder:
@Component public class DepartmentManager implementerer Manager {@Override public String getManagerName () {returner "Department manager"; }}
Og GeneralManager bønne:
@Komponent @ Primær offentlig klasse GeneralManager implementerer Manager {@Override public String getManagerName () {returner "General manager"; }}
De tilsidesætter begge getManagerName () af Manager interface. Bemærk også, at vi markerer GeneralManager bønne med @Primær.
Denne gang, @Primær giver kun mening, når vi aktiverer komponentscanningen:
@Configuration @ComponentScan (basePackages = "org.baeldung.primary") offentlig klasse Config {}
Lad os oprette en tjeneste til brug af afhængighedsinjektion, mens vi finder den rigtige bønne:
@Service offentlig klasse ManagerService {@Autowired privat manager manager; public Manager getManager () {return manager; }}
Her begge bønner Afdelingsleder og GeneralManager er berettiget til autokabler.
Som vi markerede GeneralManager bønne med @Primær, vil det blive valgt til afhængighedsinjektion:
ManagerService service = context.getBean (ManagerService.class); Manager manager = service.getManager (); System.out.println (manager.getManagerName ());
Outputtet er “General manager ”.
5. Konklusion
I denne artikel lærte vi om Spring's @Primær kommentar. Med kodeeksemplerne demonstrerede vi behovet for og brugen af @Primær.
Som sædvanlig er den komplette kode til denne artikel tilgængelig på GitHub-projektet.