Primavera - Colecciones de inyección

1. Introducción

En este tutorial, mostraremos cómo inyectar colecciones de Java utilizando el marco Spring .

En pocas palabras, demostraremos ejemplos con las interfaces de colección List, Map, Set .

2. Lista con @Autowired

Creemos un bean de ejemplo:

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

Aquí, declaramos la propiedad nameList para contener una lista de valores de cadena .

En este ejemplo, usamos la inyección de campo para nameList . Por lo tanto, colocamos la anotación @Autowired .

Para obtener más información sobre la inyección de dependencia o las diferentes formas de implementarla, consulte esta guía.

Después, registramos el CollectionsBean en la clase de instalación de configuración:

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

Además de registrar CollectionsBean , también inyectamos una nueva lista inicializándola explícitamente y devolviéndola como una configuración de @Bean separada .

Ahora, podemos probar los resultados:

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

La salida del método printNameList ():

[John, Adam, Harry]

3. Establecer con inyección de constructor

Para configurar el mismo ejemplo con la colección Set , modifiquemos la clase CollectionsBean :

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

Esta vez queremos usar una inyección de constructor para inicializar la propiedad nameSet . Esto también requiere cambios en la clase de configuración:

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

4. Mapa con inyección de Setter

Siguiendo la misma lógica, agreguemos el campo nameMap para demostrar la inyección del mapa:

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

Esta vez tenemos un método setter para usar una inyección de dependencia setter . También necesitamos agregar el código de inicialización del mapa en la clase de configuración:

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

Los resultados después de invocar el método printNameMap () :

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

5. Inyección de referencias de frijoles

Veamos un ejemplo en el que inyectamos referencias de frijoles como elementos de la colección.

Primero, creemos el bean:

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

Y agregue una Lista de BaeldungBean como una propiedad a la clase CollectionsBean :

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

A continuación, agregamos los métodos de fábrica de configuración de Java para cada elemento 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 }

El contenedor Spring inyecta los granos individuales del tipo BaeldungBean en una colección.

Para probar esto, invocamos el método collectionsBean.printBeanList () . La salida muestra los nombres de los frijoles como elementos de lista:

[John, Harry, Adam]

Ahora, consideremos un escenario en el que no hay un BaeldungBean . Si no hay un BaeldungBean registrado en el contexto de la aplicación, Spring lanzará una excepción porque falta la dependencia requerida.

Podemos usar @Autowired (required = false) para marcar la dependencia como opcional. En lugar de lanzar una excepción, beanList no se inicializará y su valor permanecerá nulo .

Si necesitamos una lista vacía en lugar de nula, podemos inicializar beanList con una nueva ArrayList:

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

5.1. Usar @Order para ordenar frijoles

Podemos especificar el orden de los frijoles mientras inyectamos en la colección .

Para ese propósito, usamos la anotación @Order y especificamos el índice:

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

El contenedor Spring primero inyectará el frijol con el nombre "Harry" , ya que tiene el valor de orden más bajo.

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

De la salida, vemos que nuestra colección tiene un solo elemento:

[John]

6. Configuración de una lista vacía como valor predeterminado

Podemos establecer el valor predeterminado para una propiedad List inyectada como una lista vacía usando el método estático Collections.emptyList () :

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

Si ejecutamos esto con la clave "names.list" no inicializada a través del archivo de propiedades:

collectionsBean.printNameListWithDefaults();

Obtendremos una lista vacía como salida:

[ ]

7. Resumen

Con esta guía, aprendimos cómo inyectar diferentes tipos de colecciones de Java usando el marco Spring.

También examinamos la inyección con tipos de referencia y cómo seleccionarlos u ordenarlos dentro de la colección.

Como es habitual, el código completo está disponible en el proyecto GitHub.