Vår - Injiserende samlinger

1. Introduksjon

I denne opplæringen skal vi vise hvordan injiser Java samlinger ved hjelp av vårrammen.

Enkelt sagt, vi vil demonstrere eksempler med Liste, kart, sett samlingsgrensesnitt.

2. Liste Med @Autowired

La oss lage et eksempel på en bønne:

offentlig klasse CollectionsBean {@Autowired private List nameList; public void printNameList () {System.out.println (nameList); }}

Her erklærte vi at navneliste eiendom å holde en Liste av String verdier.

I dette eksemplet bruker vi feltinjeksjon for navneliste. Derfor setter vi @Autowired kommentar.

For å lære mer om avhengighetsinjeksjon eller forskjellige måter å implementere den på, kan du sjekke ut denne veiledningen.

Etter registrerer vi CollectionsBean i konfigurasjonsoppsettklassen:

@Configuration public class CollectionConfig {@Bean public CollectionsBean getCollectionsBean () {return new CollectionsBean (); } @Bean public List nameList () {return Arrays.asList ("John", "Adam", "Harry"); }}

Foruten å registrere CollectionsBean, vi injiserer også en ny liste ved eksplisitt å initialisere og returnere den som en separat @Bønne konfigurasjon.

Nå kan vi teste resultatene:

ApplicationContext context = new AnnotationConfigApplicationContext (CollectionConfig.class); CollectionsBean collectionBean = context.getBean (CollectionsBean.class); collectionBean.printNameList ();

Resultatet av printNameList () -metoden:

[John, Adam, Harry]

3. Sett Med Constructor Injection

For å sette opp det samme eksemplet med Sett samling, la oss endre CollectionsBean klasse:

offentlig klasse CollectionsBean {private Set nameSet; public CollectionsBean (Set strings) {this.nameSet = strings; } public void printNameSet () {System.out.println (nameSet); }}

Denne gangen ønsker vi å bruke en konstruktørinjeksjon for å initialisere nameSet eiendom. Dette krever også endringer i konfigurasjonsklassen:

@Bean public CollectionsBean getCollectionsBean () {return new CollectionsBean (new HashSet (Arrays.asList ("John", "Adam", "Harry"))); }

4. Kart Med Setter Injection

Etter samme logikk, la oss legge til nameMap felt for å demonstrere kartinjeksjonen:

offentlig klasse CollectionsBean {private Map nameMap; @Autowired public void setNameMap (Map nameMap) {this.nameMap = nameMap; } public void printNameMap () {System.out.println (nameMap); }}

Denne gangen vi har en settermetode for å kunne bruke en setteravhengighetsinjeksjon. Vi må også legge til Kart initialisering av kode i konfigurasjonsklasse:

@Bean public Map nameMap () {Map nameMap = new HashMap (); nameMap.put (1, "John"); nameMap.put (2, "Adam"); nameMap.put (3, "Harry"); return nameMap; }

Resultatene etter å ha påkalt printNameMap () metode:

{1 = John, 2 = Adam, 3 = Harry}

5. Injisering av bønnereferanser

La oss se på et eksempel der vi injiserer bønnehenvisninger som elementer i samlingen.

La oss først lage bønnen:

offentlig klasse BaeldungBean {privat strengnavn; // konstruktør}

Og legg til en Liste av BaeldungBean som en eiendom til CollectionsBean klasse:

offentlig klasse CollectionsBean {@Autowired (obligatorisk = falsk) privat liste beanList; offentlig ugyldig printBeanList () {System.out.println (beanList); }}

Deretter legger vi til Java-konfigurasjonsfabrikkmetodene for hver BaeldungBean element:

@Configuration public class CollectionConfig {@Bean public BaeldungBean getElement () {return new BaeldungBean ("John"); } @Bean public BaeldungBean getAnotherElement () {return new BaeldungBean ("Adam"); } @Bean public BaeldungBean getOneMoreElement () {return new BaeldungBean ("Harry"); } // andre fabriksmetoder}

Fjærbeholderen injiserer de enkelte bønnene i BaeldungBean skriv inn i en samling.

For å teste dette påkaller vi collectionBean.printBeanList () metode. Utgangen viser bønnenavnene som listeelementer:

[John, Harry, Adam]

Nå, la oss vurdere et scenario når det ikke er et BaeldungBean. Hvis det ikke er en BaeldungBean registrert i søknadssammenheng, vil Spring kaste et unntak fordi den nødvendige avhengigheten mangler.

Vi kan bruke @Autowired (obligatorisk = usann) for å markere avhengigheten som valgfri. I stedet for å kaste et unntak, har beanList vil ikke bli initialisert og verdien vil forbli null.

Hvis vi trenger en tom liste i stedet for null, vi kan initialisere beanList med en ny ArrayList:

@Autowired (obligatorisk = falsk) privat liste beanList = ny ArrayList ();

5.1. Ved hjelp av @Rekkefølge å sortere bønner

Vi kan spesifisere rekkefølgen på bønnene mens vi injiserer i samlingen.

For det formålet bruker vi @Rekkefølge kommentar og spesifiser indeksen:

@Configuration public class CollectionConfig {@Bean @Order (2) public BaeldungBean getElement () {return new BaeldungBean ("John"); } @Bean @Order (3) offentlig BaeldungBean getAnotherElement () {returner ny BaeldungBean ("Adam"); } @Bean @Order (1) offentlig BaeldungBean getOneMoreElement () {returner nye BaeldungBean ("Harry"); }}

Vårbeholderen injiserer først bønnen med navnet “Harry”, siden den har den laveste ordreværdien.

Den vil da injisere “John”, og til slutt, “Adam” bønne:

[Harry, John, Adam]

Lære mer om @Rekkefølge i denne guiden.

5.2. Ved hjelp av @Kvalifiserende for å velge bønner

Vi kan bruke @Kvalifiserende for å velge bønnene som skal injiseres i den spesifikke samlingen som samsvarer med @Kvalifiserende Navn.

Slik bruker vi det til injeksjonspunktet:

@Autowired @Qualifier ("CollectionsBean") privatliste beanList;

Deretter markerer vi med det samme @Kvalifiserende bønnene som vi ønsker å injisere i Liste:

@Configuration public class CollectionConfig {@Bean @Qualifier ("CollectionsBean") public BaeldungBean getElement () {return new BaeldungBean ("John"); } @Bean public BaeldungBean getAnotherElement () {return new BaeldungBean ("Adam"); } @Bean public BaeldungBean getOneMoreElement () {return new BaeldungBean ("Harry"); } // andre fabriksmetoder}

I dette eksemplet spesifiserer vi at bønnen med navnet “John” vil bli injisert i Liste heter “CollectionsBean”. Resultatene vi tester her:

ApplicationContext context = new AnnotationConfigApplicationContext (CollectionConfig.class); CollectionsBean collectionBean = context.getBean (CollectionsBean.class); collectionBean.printBeanList ();

Fra produksjonen ser vi at samlingen vår bare har ett element:

[John]

6. Angi en tom liste som standardverdi

Vi kan angi standardverdien for en injisert listeegenskap som en tom liste ved å bruke Collections.emptyList () statisk metode:

public class CollectionsBean {@Value ("$ {names.list:} # {T (java.util.Collections) .emptyList ()}") private List nameListWithDefaultValue; public void printNameListWithDefaults () {System.out.println (nameListWithDefaultValue); }}

Hvis vi kjører dette med "names.list" -tasten ikke initialisert via egenskapsfil:

collectionBean.printNameListWithDefaults ();

Vi får en tom liste som utdata:

[ ]

7. Oppsummering

Med denne guiden lærte vi hvordan vi injiserer forskjellige typer Java-samlinger ved hjelp av Spring-rammeverket.

Vi undersøkte også injeksjon med referansetyper og hvordan du velger eller bestiller dem inne i samlingen.

Som vanlig er den komplette koden tilgjengelig i GitHub-prosjektet.