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.