Lente - Collecties injecteren

1. Inleiding

In deze tutorial laten we zien hoe injecteren Java collecties met behulp van het Spring-framework.

Simpel gezegd, we zullen voorbeelden demonstreren met de Lijst, kaart, set collectie-interfaces.

2. Lijst Met @Autowired

Laten we een voorbeeldboon maken:

openbare klasse CollectionsBean {@Autowired privélijst nameList; openbare ongeldige printNameList () {System.out.println (nameList); }}

Hier hebben we de namenlijst eigendom om een Lijst van Draad waarden.

In dit voorbeeld gebruiken we veldinjectie voor namenlijst. Daarom plaatsen we de @Autowired annotatie.

Raadpleeg deze handleiding voor meer informatie over de afhankelijkheidsinjectie of verschillende manieren om deze te implementeren.

Daarna registreren we het CollectiesBean in de configuratie setup-klasse:

@Configuration openbare klasse CollectionConfig {@Bean openbare CollectionsBean getCollectionsBean () {retourneer nieuwe CollectionsBean (); } @Bean openbare lijst nameList () {retourneer Arrays.asList ("John", "Adam", "Harry"); }}

Naast het registreren van het CollectiesBean, we injecteren ook een nieuwe lijst door deze expliciet te initialiseren en terug te sturen als een aparte lijst @Boon configuratie.

Nu kunnen we de resultaten testen:

ApplicationContext context = nieuwe AnnotationConfigApplicationContext (CollectionConfig.class); CollectionsBean collectionsBean = context.getBean (CollectionsBean.class); CollectionsBean.printNameList ();

De uitvoer van de methode printNameList ():

[John, Adam, Harry]

3. Set Met Constructor Injection

Om hetzelfde voorbeeld op te zetten met de Set collectie, laten we de CollectiesBean klasse:

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

Deze keer willen we een constructor-injectie gebruiken voor het initialiseren van het nameSet eigendom. Dit vereist ook wijzigingen in de configuratieklasse:

@Bean openbare CollectionsBean getCollectionsBean () {retourneer nieuwe CollectionsBean (nieuwe HashSet (Arrays.asList ("John", "Adam", "Harry"))); }

4. Kaart Met Setter-injectie

Laten we volgens dezelfde logica de naamkaart veld om de kaartinjectie te demonstreren:

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

Deze keer we hebben een setter-methode om een ​​setter-afhankelijkheidsinjectie te gebruiken. We moeten ook het Kaart initialisatiecode in configuratieklasse:

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

De resultaten na het aanroepen van de printNameMap () methode:

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

5. Het injecteren van bonenreferenties

Laten we eens kijken naar een voorbeeld waarin we bonenreferenties als elementen van de verzameling injecteren.

Laten we eerst de boon maken:

openbare klasse BaeldungBean {private String-naam; // constructor}

En voeg een Lijst van BaeldungBean als eigendom van de CollectiesBean klasse:

openbare klasse CollectionsBean {@Autowired (verplicht = false) privélijst beanList; openbare ongeldige printBeanList () {System.out.println (beanList); }}

Vervolgens voegen we voor elk de Java-configuratiefabrieksmethoden toe BaeldungBean element:

@Configuration openbare klasse CollectionConfig {@Bean openbare BaeldungBean getElement () {retourneer nieuwe BaeldungBean ("John"); } @Bean public BaeldungBean getAnotherElement () {retourneer nieuwe BaeldungBean ("Adam"); } @Bean public BaeldungBean getOneMoreElement () {retourneer nieuwe BaeldungBean ("Harry"); } // andere fabrieksmethoden}

De Spring-container injecteert de individuele bonen van de BaeldungBean typ in een verzameling.

Om dit te testen, gebruiken we de CollectionsBean.printBeanList () methode. De uitvoer toont de bean-namen als lijstelementen:

[John, Harry, Adam]

Nu, laten we eens kijken naar een scenario als er geen BaeldungBean. Als er geen BaeldungBean geregistreerd in de toepassingscontext, genereert Spring een uitzondering omdat de vereiste afhankelijkheid ontbreekt.

We kunnen gebruiken @Autowired (verplicht = false) om de afhankelijkheid als optioneel te markeren. In plaats van een uitzondering te maken, kan de beanList wordt niet geïnitialiseerd en de waarde blijft behouden nul.

Als we een lege lijst nodig hebben in plaats van nul, we kunnen initialiseren beanList met een nieuwe ArrayList:

@Autowired (verplicht = false) privélijst beanList = nieuwe ArrayList ();

5.1. Gebruik makend van @Bestellen om bonen te sorteren

We kunnen de volgorde van de bonen specificeren tijdens het injecteren in de collectie.

Voor dat doel gebruiken we de @Bestellen annotatie en specificeer de index:

@Configuration openbare klasse CollectionConfig {@Bean @Order (2) openbare BaeldungBean getElement () {retourneer nieuwe BaeldungBean ("John"); } @Bean @Order (3) openbare BaeldungBean getAnotherElement () {retourneer nieuwe BaeldungBean ("Adam"); } @Bean @Order (1) openbare BaeldungBean getOneMoreElement () {retourneer nieuwe BaeldungBean ("Harry"); }}

Spring container zal eerst de boon met de naam injecteren "Harry", omdat het de laagste bestelwaarde heeft.

Het zal dan de "John", en tot slot, de "Adam" Boon:

[Harry, John, Adam]

Leer meer over @Bestellen in deze gids.

5.2. Gebruik makend van @Kwalificatie om bonen te selecteren

We kunnen de @Kwalificatie om de bonen te selecteren die in de specifieke collectie moeten worden geïnjecteerd die overeenkomt met de @Kwalificatie naam.

Hier is hoe we het gebruiken voor het injectiepunt:

@Autowired @Qualifier ("CollectionsBean") privélijst beanList;

Vervolgens markeren we met hetzelfde @Kwalificatie de bonen die we in de willen injecteren Lijst:

@Configuration openbare klasse CollectionConfig {@Bean @Qualifier ("CollectionsBean") openbare BaeldungBean getElement () {retourneer nieuwe BaeldungBean ("John"); } @Bean public BaeldungBean getAnotherElement () {retourneer nieuwe BaeldungBean ("Adam"); } @Bean public BaeldungBean getOneMoreElement () {retourneer nieuwe BaeldungBean ("Harry"); } // andere fabrieksmethoden}

In dit voorbeeld specificeren we dat de boon met de naam "John" zal worden geïnjecteerd in de Lijst genaamd "CollectionsBean". De resultaten die we hier testen:

ApplicationContext context = nieuwe AnnotationConfigApplicationContext (CollectionConfig.class); CollectionsBean collectionsBean = context.getBean (CollectionsBean.class); CollectionsBean.printBeanList ();

Uit de output zien we dat onze collectie maar één element heeft:

[John]

6. Een lege lijst instellen als een standaardwaarde

We kunnen de standaardwaarde voor een geïnjecteerde List-eigenschap instellen als een lege lijst door de Collections.emptyList () statische methode:

openbare klasse CollectionsBean {@Value ("$ {names.list:} # {T (java.util.Collections) .emptyList ()}") privélijst nameListWithDefaultValue; openbare ongeldige printNameListWithDefaults () {System.out.println (nameListWithDefaultValue); }}

Als we dit uitvoeren met de "names.list" -sleutel die niet is geïnitialiseerd via het eigenschappenbestand:

CollectionsBean.printNameListWithDefaults ();

We krijgen een lege lijst als uitvoer:

[ ]

7. Samenvatting

Met deze gids hebben we geleerd hoe we verschillende soorten Java-verzamelingen kunnen injecteren met behulp van het Spring-framework.

We hebben ook gekeken naar injectie met referentietypes en hoe deze in de collectie kunnen worden geselecteerd of besteld.

Zoals gewoonlijk is de volledige code beschikbaar in het GitHub-project.


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