Spring - Injizierende Sammlungen

1. Einleitung

In diesem Tutorial werden wir zeigen , wie man injiziert Java Sammlungen mit dem Spring - Framework .

Einfach ausgedrückt, zeigen wir Beispiele mit den Sammlungsschnittstellen List, Map, Set .

2. Liste mit @Autowired

Erstellen wir eine Beispielbohne:

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

Hier haben wir die nameList- Eigenschaft so deklariert , dass sie eine Liste von String- Werten enthält.

In diesem Beispiel verwenden wir die Feldinjektion für nameList . Daher setzen wir die Annotation @Autowired .

Weitere Informationen zur Abhängigkeitsinjektion oder zu verschiedenen Implementierungsmethoden finden Sie in diesem Handbuch.

Danach registrieren wir die CollectionsBean in der Konfigurations-Setup-Klasse:

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

Neben der Registrierung der CollectionsBean fügen wir auch eine neue Liste hinzu, indem wir sie explizit initialisieren und als separate @ Bean- Konfiguration zurückgeben.

Jetzt können wir die Ergebnisse testen:

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

Die Ausgabe der printNameList () -Methode:

[John, Adam, Harry]

3. Set mit Constructor Injection

Um dasselbe Beispiel mit der Set- Auflistung einzurichten , ändern wir die CollectionsBean- Klasse:

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

Dieses Mal möchten wir eine Konstruktorinjektion zum Initialisieren der nameSet- Eigenschaft verwenden . Dies erfordert auch Änderungen in der Konfigurationsklasse:

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

4. Karte mit Setter-Injektion

Fügen Sie nach der gleichen Logik das Feld nameMap hinzu , um die Karteninjektion zu demonstrieren:

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

Dieses Mal haben wir eine Setter-Methode, um eine Setter-Abhängigkeitsinjektion zu verwenden . Wir müssen auch den Map- Initialisierungscode in der Konfigurationsklasse hinzufügen :

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

Die Ergebnisse nach dem Aufrufen der printNameMap () -Methode:

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

5. Injizieren von Bean-Referenzen

Schauen wir uns ein Beispiel an, in dem wir Bean-Referenzen als Elemente der Sammlung einfügen.

Lassen Sie uns zuerst die Bohne erstellen:

public class BaeldungBean { private String name; // constructor }

Fügen Sie der CollectionsBean- Klasse eine Liste von BaeldungBean als Eigenschaft hinzu :

public class CollectionsBean { @Autowired(required = false) private List beanList; public void printBeanList() { System.out.println(beanList); } }

Als Nächstes fügen wir die Java-Konfigurationsfactory-Methoden für jedes BaeldungBean- Element hinzu:

@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"); } // other factory methods }

Der Spring-Container injiziert die einzelnen Bohnen vom Typ BaeldungBean in eine Sammlung.

Um dies zu testen, rufen wir die Methode collectionBean.printBeanList () auf . Die Ausgabe zeigt die Bean-Namen als Listenelemente:

[John, Harry, Adam]

Nun lassen Sie uns ein Szenario, wenn es sich nicht um eine BaeldungBean . Wenn im Anwendungskontext keine BaeldungBean registriert ist, löst Spring eine Ausnahme aus, da die erforderliche Abhängigkeit fehlt.

Wir können @Autowired (erforderlich = falsch) verwenden , um die Abhängigkeit als optional zu markieren. Anstatt eine Ausnahme auszulösen, wird die beanList nicht initialisiert und ihr Wert bleibt null .

Wenn wir eine leere Liste anstelle von null benötigen , können wir beanList mit einer neuen ArrayList initialisieren :

@Autowired(required = false) private List beanList = new ArrayList();

5.1. Verwenden von @Order zum Sortieren von Bohnen

Wir können die Reihenfolge der Bohnen angeben, während sie in die Sammlung injiziert werden .

Zu diesem Zweck verwenden wir die Annotation @Order und geben den Index an:

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

Der Frühlingsbehälter injiziert der Bohne zuerst den Namen „Harry“ , da sie den niedrigsten Bestellwert hat.

It will then inject the “John”, and finally, the “Adam” bean:

[Harry, John, Adam]

Learn more about @Order in this guide.

5.2. Using @Qualifier to Select Beans

We can use the @Qualifier to select the beans to be injected into the specific collection that matches the @Qualifier name.

Here's how we use it for the injection point:

@Autowired @Qualifier("CollectionsBean") private List beanList;

Then, we mark with the same @Qualifier the beans that we want to inject into the List:

@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"); } // other factory methods }

In this example, we specify that the bean with the name “John” will be injected into the List named “CollectionsBean”. The results we test here:

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

Aus der Ausgabe geht hervor, dass unsere Sammlung nur ein Element enthält:

[John]

6. Festlegen einer leeren Liste als Standardwert

Mit der statischen Methode Collections.emptyList () können wir den Standardwert für eine injizierte List-Eigenschaft als leere Liste festlegen :

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

Wenn wir dies mit dem Schlüssel "names.list" ausführen, der nicht über die Eigenschaftendatei initialisiert wurde:

collectionsBean.printNameListWithDefaults();

Wir erhalten eine leere Liste als Ausgabe:

[ ]

7. Zusammenfassung

In diesem Handbuch haben wir gelernt, wie verschiedene Arten von Java-Sammlungen mithilfe des Spring-Frameworks eingefügt werden.

Wir haben auch die Injektion mit Referenztypen untersucht und untersucht, wie diese innerhalb der Sammlung ausgewählt oder bestellt werden können.

Der vollständige Code ist wie gewohnt im GitHub-Projekt verfügbar.