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.