sábado, 21 de noviembre de 2009

Inyección de dependencia


Lo prometido es deuda, vamos a hacer un ejemplo de inyección de dependencia bastante simple usando como framework spring. Spring no es el único framework de Inyección de Dependencia, pero es sin duda el más usado.
Vamos a los bifes!!! Vamos a hacer un servicio que salude. Antes de empezar a escribir el servicio vamos a hacer una interfaz que lo describa.

package com.ejemplo;

public interface SaludadorService {

String saludar();
}

Esto, por que lo hacemos? Cuando nosotros queramos usar nuestro servicio vamos a usar esta interfaz, de esta forma si cambia la implementación, no vamos a necesitar cambiar el código.
Implementemos la interfaz!!!

package com.ejemplo;

/**
* Implementación de SaludadorService
*
* @author Emanuel
*/
public class SaludadorServiceImpl implements SaludadorService {

private String saludo;

public void setSaludo(String saludo) {
this.saludo = saludo;
}

public SaludadorServiceImpl() { }

public SaludadorServiceImpl(String saludo) {
this.saludo = saludo;
}
@Override
public String saludar() {
return saludo;
}
}


Bastante simple, ahora debemos hacer a configurar el xml para que spring sepa que inyectar.


<?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 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="saludador" class="com.ejemplo.SaludadorServiceImpl" >
<property name="saludo" value="Holasss !! " />
</bean>
</beans>


Ahí inyectamos el valor “Holasss !!” a la propiedad saludo por medio del set, es decir spring va a hacer lo siguiente:

SaludadorServiceImpl saludador = new SaludadorServiceImpl();
saludador.setSaludo("Holasss !! ");

Podriamos haberlo hecho por constructor de la siguiente forma:

<bean id="saludador" class="com.ejemplo.SaludadorServiceImpl" >
<constructor-arg index="0" value=" Holasss !! " />
</bean>

Podemos discutir todo un día cual es mejor si inyectar por set o constructor. Yo personalmente uso por set. Ustedes usen el que le parezca.
Ahora vamos a usar nuestro bean:

/**
* @author Emanuel
*
*/
public class Principal {

public static void main(String[] args) {
BeanFactory fabrica = new XmlBeanFactory(new FileSystemResource("bean.xml"));
SaludadorService saludador = (SaludadorService)fabrica.getBean("saludador");
System.out.println(saludador.saludar());
}
}

Y Listo!!

Si fueron observadores yo construyo una fabrica con un archivo xml donde declare el bean. Además uso la interfaz de esta forma el día de mañana quiero cambiar la implementación , lo pueda hacer sin problema, sin modificar código solo tocando el xml.

Además use spring solo como fabrica de beans, no como contenedor, como contenedor es más potente. Pero esto es otra historia...