Printemps - Collections d'injection

1. Introduction

Dans ce tutoriel, nous allons montrer comment injecter des collections Java à l'aide du framework Spring .

En termes simples, nous allons montrer des exemples avec les interfaces de collection List, Map, Set .

2. Liste avec @Autowired

Créons un exemple de bean:

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

Ici, nous avons déclaré que la propriété nameList contenait une liste de valeurs de chaîne .

Dans cet exemple, nous utilisons l'injection de champ pour nameList . Par conséquent, nous mettons l' annotation @Autowired .

Pour en savoir plus sur l'injection de dépendances ou sur les différentes façons de l'implémenter, consultez ce guide.

Après, nous enregistrons le CollectionsBean dans la classe de configuration de configuration:

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

En plus d'enregistrer le CollectionsBean , nous injectons également une nouvelle liste en l'initialisant explicitement et en la renvoyant en tant que configuration @Bean séparée .

Maintenant, nous pouvons tester les résultats:

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

La sortie de la méthode printNameList ():

[John, Adam, Harry]

3. Définir avec injection de constructeur

Pour configurer le même exemple avec la collection Set , modifions la classe CollectionsBean :

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

Cette fois, nous voulons utiliser une injection de constructeur pour initialiser la propriété nameSet . Cela nécessite également des changements dans la classe de configuration:

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

4. Carte avec injection de poseur

En suivant la même logique, ajoutons le champ nameMap pour illustrer l'injection de carte:

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

Cette fois, nous avons une méthode setter afin d'utiliser une injection de dépendance setter . Nous devons également ajouter le code d'initialisation de la carte dans la classe de configuration:

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

Les résultats après avoir appelé la méthode printNameMap () :

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

5. Injection de références de haricots

Regardons un exemple où nous injectons des références de bean comme éléments de la collection.

Tout d'abord, créons le bean:

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

Et ajoutez une liste de BaeldungBean en tant que propriété à la classe CollectionsBean :

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

Ensuite, nous ajoutons les méthodes de fabrique de configuration Java pour chaque élément BaeldungBean :

@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 }

Le conteneur Spring injecte les beans individuels du type BaeldungBean dans une seule collection.

Pour tester cela, nous appelons la méthode collectionsBean.printBeanList () . La sortie affiche les noms de bean sous forme d'éléments de liste:

[John, Harry, Adam]

Maintenant, considérons un scénario où il n'y a pas de BaeldungBean . S'il n'y a pas de BaeldungBean enregistré dans le contexte de l'application, Spring lèvera une exception car la dépendance requise est manquante.

Nous pouvons utiliser @Autowired (required = false) pour marquer la dépendance comme facultative. Au lieu de lever une exception, le beanList ne sera pas initialisé et sa valeur restera nulle .

Si nous avons besoin d'une liste vide au lieu de null, nous pouvons initialiser beanList avec un nouveau ArrayList:

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

5.1. Utiliser @Order pour trier les haricots

Nous pouvons spécifier l'ordre des beans lors de l'injection dans la collection .

Pour cela, nous utilisons l' annotation @Order et spécifions l'index:

@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"); } }

Le conteneur à ressort injectera d'abord le haricot avec le nom «Harry» , car il a la valeur d'ordre le plus bas.

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();

À partir de la sortie, nous voyons que notre collection n'a qu'un seul élément:

[John]

6. Définition d'une liste vide comme valeur par défaut

Nous pouvons définir la valeur par défaut d'une propriété List injectée sous la forme d'une liste vide en utilisant la méthode statique Collections.emptyList () :

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

Si nous exécutons cela avec la clé «names.list» non initialisée via le fichier de propriétés:

collectionsBean.printNameListWithDefaults();

Nous obtiendrons une liste vide en sortie:

[ ]

7. Résumé

Avec ce guide, nous avons appris à injecter différents types de collections Java à l'aide du framework Spring.

Nous avons également examiné l'injection avec des types de référence et comment les sélectionner ou les ordonner à l'intérieur de la collection.

Comme d'habitude, le code complet est disponible dans le projet GitHub.