Spring @Primary Annotation
1. Oversikt
I denne raske opplæringen vil vi diskutere vårens @Hoved kommentar som ble introdusert med versjon 3.0 av rammeverket.
For å si det enkelt, vi bruker @Hoved å gi høyere preferanse til en bønne når det er flere bønner av samme type.
La oss beskrive problemet i detalj.
2. Hvorfor er @Hoved Behov for?
I noen tilfeller, vi trenger å registrere mer enn en bønne av samme type.
I dette eksemplet har vi JohnMedarbeider () og TonyMedarbeider () bønner av Ansatt type:
@Configuration public class Config {@Bean offentlig ansatt JohnEmployee () {returner ny ansatt ("John"); } @Bean offentlig ansatt TonyEmployee () {returner ny ansatt ("Tony"); }}
Våren kaster NoUniqueBeanDefinitionException hvis vi prøver å kjøre applikasjonen.
For å få tilgang til bønner av samme type som vi vanligvis bruker @Qualifier (“beanName”) kommentar.
Vi bruker den på injeksjonsstedet sammen med @Autowired. I vårt tilfelle velger vi bønnene i konfigurasjonsfasen slik @Kvalifiserende kan ikke brukes her. Vi kan lære mer om @Kvalifiserende kommentar ved å følge lenken.
For å løse dette problemet tilbyr Spring the @Hoved kommentar.
3. Bruk @Hoved Med @Bønne
La oss ta en titt på konfigurasjonsklassen:
@Configuration public class Config {@Bean offentlig ansatt JohnEmployee () {returner ny ansatt ("John"); } @Bean @Primary offentlig ansatt TonyEmployee () {returner ny ansatt ("Tony"); }}
Vi markerer TonyMedarbeider () bønne med @Hoved. Våren vil injisere TonyMedarbeider () bønne fortrinnsvis over JohnMedarbeider ().
La oss nå starte applikasjonskonteksten og få Ansatt bønne fra den:
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext (Config.class); Ansatt ansatt = context.getBean (ansatt.klasse); System.out.println (ansatt);
Etter at vi har kjørt applikasjonen:
Ansatt {name = 'Tony'}
Fra produksjonen kan vi se at TonyMedarbeider () forekomsten har en preferanse mens den er automatisk kablet.
4. Bruk @Hoved Med @Komponent
Vi kan bruke @Primary direkte på bønnene. La oss ta en titt på følgende scenario:
offentlig grensesnittleder {String getManagerName (); }
Vi har en sjef grensesnitt og to underklassebønner, Avdelingsleder:
@Component public class DepartmentManager implementerer Manager {@Override public String getManagerName () {return "Department manager"; }}
Og Daglig leder bønne:
@Component @Primary public class GeneralManager implementerer Manager {@Override public String getManagerName () {return "General manager"; }}
De overstyrer begge to getManagerName () av sjef grensesnitt. Vær også oppmerksom på at vi merker Daglig leder bønne med @Hoved.
Denne gangen, @Hoved er bare fornuftig når vi aktiverer komponentskanningen:
@Configuration @ComponentScan (basePackages = "org.baeldung.primary") offentlig klasse Config {}
La oss lage en tjeneste for å bruke avhengighetsinjeksjon mens vi finner den rette bønnen:
@Service public class ManagerService {@Autowired private Manager manager; public Manager getManager () {retur manager; }}
Her begge bønnene Avdelingsleder og Daglig leder er kvalifisert for autoledning.
Som vi markerte Daglig leder bønne med @Hoved, blir det valgt for avhengighetsinjeksjon:
ManagerService-tjeneste = context.getBean (ManagerService.class); Manager manager = service.getManager (); System.out.println (manager.getManagerName ());
Resultatet er “Daglig leder".
5. Konklusjon
I denne artikkelen lærte vi om vårens @Hoved kommentar. Med kodeeksemplene demonstrerte vi behovet og brukssakene til @Hoved.
Som vanlig er den komplette koden for denne artikkelen tilgjengelig på GitHub-prosjektet.