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.


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