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
- Interface Profesion
- Clase ProfesionPoliciaImpl
- Clase Direccion
- Clase Persona
- Contenedor Spring
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
Comentarios
Publicar un comentario