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.