Forår - Injektion af samlinger

1. Introduktion

I denne vejledning skal vi vise, hvordan man gør det indsprøjte Java samlinger ved hjælp af forårets ramme.

Kort sagt, vi demonstrerer eksempler med Liste, kort, sæt samling grænseflader.

2. Liste Med @Autowired

Lad os oprette et eksempel på en bønne:

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

Her erklærede vi, at navneliste ejendom til at holde en Liste af Snor værdier.

I dette eksempel bruger vi feltinjektion til navneliste. Derfor sætter vi @Autowired kommentar.

For at lære mere om afhængighedsinjektion eller forskellige måder at implementere den på, se denne vejledning.

Efter registrerer vi CollectionsBean i konfigurationsopsætningsklassen:

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

Udover at registrere CollectionsBean, vi indsprøjter også en ny liste ved eksplicit at initialisere og returnere den som en separat @Bønne konfiguration.

Nu kan vi teste resultaterne:

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

Outputtet af printNameList () -metoden:

[John, Adam, Harry]

3. Sæt Med konstruktørinjektion

For at indstille det samme eksempel med Sæt samling, lad os ændre CollectionsBean klasse:

public class CollectionsBean {private Set nameSet; offentlige CollectionsBean (sæt strenge) {this.nameSet = strings; } public void printNameSet () {System.out.println (nameSet); }}

Denne gang vil vi bruge en konstruktionsinjektion til at initialisere nameSet ejendom. Dette kræver også ændringer i konfigurationsklassen:

@Bean public CollectionsBean getCollectionsBean () {returner nye CollectionsBean (ny HashSet (Arrays.asList ("John", "Adam", "Harry"))); }

4. Kort Med Setter Injection

Efter den samme logik, lad os tilføje nameMap felt for at demonstrere kortinjektionen:

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

Denne gang vi har en settermetode for at bruge en setterafhængighedsinjektion. Vi skal også tilføje Kort initialisering af kode i konfigurationsklasse:

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

Resultaterne efter påberåbelse af printNameMap () metode:

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

5. Injektion af bønnereferencer

Lad os se på et eksempel, hvor vi indsprøjter bønnehenvisninger som elementer i samlingen.

Lad os først oprette bønnen:

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

Og tilføj en Liste af BaeldungBean som en ejendom til CollectionsBean klasse:

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

Dernæst tilføjer vi Java-konfigurationsfabriksmetoderne for hver BaeldungBean element:

@Configuration offentlig klasse CollectionConfig {@Bean offentlig BaeldungBean getElement () {returner ny BaeldungBean ("John"); } @Bean offentlig BaeldungBean getAnotherElement () {returner ny BaeldungBean ("Adam"); } @Bean public BaeldungBean getOneMoreElement () {returner ny BaeldungBean ("Harry"); } // andre fabriksmetoder}

Fjederbeholderen sprøjter de enkelte bønner af BaeldungBean skriv i en samling.

For at teste dette påberåber vi os collectionBean.printBeanList () metode. Outputtet viser bønnenavne som listeelementer:

[John, Harry, Adam]

Nu, lad os overveje et scenarie, når der ikke er et BaeldungBean. Hvis der ikke er en BaeldungBean registreret i applikationskonteksten, vil Spring kaste en undtagelse, fordi den krævede afhængighed mangler.

Vi kan bruge @Autowired (krævet = falsk) for at markere afhængigheden som valgfri. I stedet for at kaste en undtagelse, er bønneliste initialiseres ikke, og dens værdi forbliver nul.

Hvis vi har brug for en tom liste i stedet for nul, vi kan initialisere bønneliste med en ny ArrayList:

@Autowired (krævet = falsk) privat liste beanList = ny ArrayList ();

5.1. Ved brug af @Bestille at sortere bønner

Vi kan specificere rækkefølgen af ​​bønnerne, mens vi injiceres i samlingen.

Til dette formål bruger vi @Bestille kommentar og angiv indekset:

@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 ny BaeldungBean ("Harry"); }}

Fjederbeholder injicerer først bønnen med navnet “Harry”, da den har den laveste ordreværdi.

Derefter injiceres den "John", og til sidst “Adam” bønne:

[Harry, John, Adam]

Lær mere om @Bestille i denne vejledning.

5.2. Ved brug af @Kvalifikator for at vælge bønner

Vi kan bruge @Kvalifikator for at vælge de bønner, der skal injiceres i den specifikke samling, der matcher @Kvalifikator navn.

Sådan bruger vi det til injektionsstedet:

@Autowired @Qualifier ("CollectionsBean") privat liste beanList;

Derefter markerer vi med det samme @Kvalifikator de bønner, som vi vil injicere i Liste:

@Configuration offentlig klasse CollectionConfig {@Bean @Qualifier ("CollectionsBean") offentlig BaeldungBean getElement () {returner ny BaeldungBean ("John"); } @Bean offentlig BaeldungBean getAnotherElement () {returner ny BaeldungBean ("Adam"); } @Bean public BaeldungBean getOneMoreElement () {returner ny BaeldungBean ("Harry"); } // andre fabriksmetoder}

I dette eksempel specificerer vi, at bønnen med navnet "John" vil blive injiceret i Liste som hedder “CollectionsBean”. De resultater, vi tester her:

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

Fra output ser vi, at vores samling kun har et element:

[John]

6. Indstilling af en tom liste som standardværdi

Vi kan indstille standardværdien for en injiceret listeegenskab som en tom liste ved hjælp af Collections.emptyList () statisk metode:

offentlig klasse CollectionsBean {@Value ("$ {names.list:} # {T (java.util.Collections) .emptyList ()}") privat Liste navnListWithDefaultValue; public void printNameListWithDefaults () {System.out.println (nameListWithDefaultValue); }}

Hvis vi kører dette med "names.list" -tasten, der ikke initialiseres via egenskabsfilen:

collectionBean.printNameListWithDefaults ();

Vi får en tom liste som output:

[ ]

7. Resume

Med denne vejledning lærte vi, hvordan man injicerer forskellige typer Java-samlinger ved hjælp af Spring-rammen.

Vi undersøgte også injektion med referencetyper og hvordan man vælger eller bestiller dem inde i samlingen.

Som sædvanlig er den komplette kode tilgængelig i GitHub-projektet.


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