Spring Framework 001 - Inyección de dependencias

De ChuWiki

Visto como instanciar clases java con Spring Framework, veamos ahora como hacer que esas clases se vean. El código completo del ejemplo lo tienes en AgendaMain.java.

Clase que recibe dependencias con Spring[editar]

Utilizando la clase Persona que hicimos en el ejemplo anterior, vamos a crear una clase Agenda que tenga un propietario (una Persona y una lista de contactos (una lista de Persona.

La clase puede ser esta

package com.chuidiang.pruebas.spring;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author fjabellan 28/05/2023
 */
public class Agenda {
    private Persona propietarioAgenda;
    private List<Persona> contactos;

    public String toString(){
        return "Propietario: "+propietarioAgenda+"\nContactos: "+ Arrays.toString(contactos.toArray());
    }
    
    // Aquí van los getter y setter de los atributos, omitidos por simplicidad de código.

Le hemos puesto además un método toString() que nos facilite sacar por pantalla el contenido de la agenda.

Fichero de configuración de Spring[editar]

El fichero de configuración de spring que usaremos es agenda-bean.xml. En él, como en el ejemplo anterior, instanciamos varias personas. Una de ellas será el propietario de la agenda. Las otras serán contactos.

Detallemos sólo la parte de la agenda, porque es donde está lo interesante de este ejemplo.

    <bean id="agenda" class="com.chuidiang.pruebas.spring.Agenda">
        <property name="propietarioAgenda" ref="Pedro"/>
        <property name="contactos">
            <list value-type="com.chuidiang.pruebas.spring.Persona">
                <ref bean="Juan"/>
                <ref bean="Antonio"/>
            </list>
        </property>
    </bean>

Como siempre, instanciamos un bean al que ponemos de identificador el nombre agenda y que es una instancia de la clase Agenda.

Le pasamos el propietarioAgenda como hicimos en el ejemplo anterior para enteros, string y Date. Pero esta vez es una clase nuestra, Persona. ¿Cual queremos pasar? Pues en este ejemplo a la que pusimos de id "Pedro".

En cuanto a los contactos, los pasamos de la misma manera, pero con una salvedad. Al ser una lista de contactos, debemos poner una etiqueta <list> indicando de qué tipo son los datos de la lista, es decir value-type="com.chuidiang.pruebas.spring.Persona". Luego ya simplemente referencias ref a los demás bean de Persona que queramos meter en la lista. En nuestro ejemplo, Juan y Antonio.

El main de la aplicación[editar]

Una vez tenemos las clases y el fichero de configuración de Spring, nos falta solo un pequeño main que lo arranque todo.

public class AgendaMain {

    public static void main(String[] args) {
        BeanFactory factory = new FileSystemXmlApplicationContext("src/main/config/agenda-beans.xml");
        System.out.println(factory.getBean("agenda"));
    }
}

Como en el ejemplo anterior, usamos la clase FileSystemXmlApplicationContext de Spring para cargar el fichero de configuración y obtener la BeanFactory de Spring. Llamando al método getBean() de esta clase pasando como parámetro el id del bean en el fichero, obtenemos la Agenda. Como le pusimos un método toString(), podemos sacarla directamente por pantalla. La salida del programa sería la siguiente

Propietario: 2 Pedro Fri Jan 01 00:00:00 CET 1999
Contactos: [1 Juan Tue Nov 23 00:00:00 CET 1943, 3 Antonio Tue Mar 13 00:00:00 CET 2001]