Inyección de dependencias III

En entradas anteriores sobre Inyección dependencias I y II, realizamos ejemplos donde los objetos definían una única dependencia y un único parámetro para la inyección mediante constructor.

Para esta entrada, vamos a realizar la inyección de varios beans, tanto por constructor como por método setter y combinaremos ambos métodos. Además, veremos como inyectar valores tipo primitivos (int, boolean, double, etc.). Notaremos ciertos detalles que se debe tener en cuenta cuando se utilizan estos tipos de datos.

Contenido

Crear Proyecto

  • groupId: com.curso.spring
  • artifactId: app-persona

Interface Profesion

 public interface Profesion {	
	void tipo();
}

Clase ProfesionPoliciaImpl

 public class ProfesionPoliciaImpl implements Profesion {	
	public void tipo(){
    	 System.out.println("Profesion: Policia");
    };
}

Clase Direccion

public class Direccion{
    private String callePrincipal;
    private int numeroCasa;
    public  Direccion(){} 
    // Métodos setter y toString()
}

Clase Persona

public class Persona{
    private int edad;
    private String fechaNacimiento;
    private boolean isCasado;
    private List <String>  telefonos;
    private Direccion direccion;
    private Profesion profesion;
    
    // edad, direccion y profesion se inyectarán por constructor, los demas por setter
   public  Persona(edad edad, Direccion direccion, Profesion profesion){
    		// asignar atributos
    	}   
   // Método toString
  public void toString(){
    	return "Persona [edad=" + edad + ", isCasado=" + isCasado + ", sueldo=" + sueldo
				+ ", telefonos=" + telefonos;
    	}
        
    // Método para ver toda la información de la persona
  public void verInformacion(){
    	System.out.println(this.toString());
	System.out.println(direccion.toString());
	profesion.tipo();
    	}
    
   // Métodos setter
}

Contenedor Spring

<?xml  version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
    			 https://www.springframework.org/schema/beans/spring-beans.xsd">
	<!--Bean Direccion -->    
  	<bean id="miDireccion" class="com.curso.spring.Direccion" > 
  	   <property name="callePrincipal" value="Calle Lorena y Quevedo" />
           <property name="numeroCasa" value="12" />        
       </bean> 
    <!--Bean Profesion -->	
      <bean id="miProfesion" class="com.curso.spring.ProfesionPoliciaImpl"/>
    
    <!--Bean Persona -->   
  	<bean id="miPersona" class="com.curso.spring.Persona" >
           <constructor-arg value="25"/>
           <constructor-arg ref="miDireccion"/>
           <constructor-arg ref="miProfesion"/>;
        
  	   <property name="sueldo" value="400" />
           <property name="casado" value="true" />
           <property name="telefonos"> 
           	<list>
           	    <value>0981805434</value>
                    <value>0984356343</value>
                    <value>0978653535</value>
                </list>
           	
            </property> 
       <bean> 
    
</beans>

Creamos los beans miDireccion, miProfesion y miPersona, en el bean miPersona combinamos la inyección mediante constructor y método setter. Cuando inyectamos datos primitivimos mediante constructor es importante que el orden en que se proveen los valores coincidan con los tipo de los parametros del constructor.

El constructor Persona (int, Direccion, Profesion), en ese mismo orden deben inyectarse los datos, primero el dato entero, seguido de Direccion y así sucesivamente.

Indicar la posición del parametro

Una alternativa para hacer coincidir los tipos, sin importar el orden en que se inyecten los valores, es utilizar el atributo index para indicar su posición, mira el ejemplo:

<!--Bean Persona -->   
 <bean id="miPersona" class="com.curso.spring.Persona" >
           <constructor-arg  index="1" ref="miDireccion"/>
           <constructor-arg index="2" ref="miProfesion"/>
           <constructor-arg  index="0" value="25"/>
 </bean

Por último, para el atributo telefonos, utilizamos <list>para expresar una lista, donde cada <value> corresponde a un elemento de la lista.

Spring pueden manejar diferentes tipos de colecciones, mira la sección colecciones de Spring.

Clase Principal TestPersona

public class TestPersona {

	public static void main(String [] args){    	
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/applicationContext.xml");
	Persona persona = context.getBean("miPersona", Persona.class);
	persona.verInformacion();

	context.close(); 
    }
}

Salida Consola

Persona [edad=25, isCasado=true, sueldo=400.0, telefonos=[0981805434, 0984356343, 0978653535]
Direccion [callePrincipal=La Lorena y Pasaje, numeroCasa=23]
Profesion: Policia

Descarga proyecto gitHub

¡Hasta pronto 👋👍!

Comentarios

Entradas populares de este blog

JWT (Json Web Token)

Instalar Java Developmet Kit(JDK)

Curso de Spring