Cargando



Inversión de Control e Inyección de Dependencias en Java/Spring

Este tutorial está dirigido a aquellos que conocen el lenguaje de programación Java y quieren expandir un poco en los conceptos que dominan.


jul 22 2014 21:38
Intermedio
jul 23 2014 06:38
Esta es la cuarta parte de una serie de tutoriales enfocados en repasar los temas básicos del lenguaje Java para preparar al lector en el uso del Framework Spring. La primera parte de esta serie de tutoriales se puede conseguir aquí, la segunda parte se puede conseguir aquí y la tercera aquí. En este tutorial veremos 2 conceptos básicos que debemos manejar si queremos usar Spring correctamente: Inversión de Control e Inyección de Dependencias.

Primero que nada, quiero aclarar que estos conceptos son mucho mejor explicados por Martin Fowler en este artículo y traducido al español en esta página pero mi intención es tratar de resumir el concepto para hacerlo fácilmente comprensible y ahorrarte un poco la lectura del artículo (aunque estás cordialmente invitado a leerlo si te quedas con más dudas).

Inversión de Control


El término es relativamente reciente pero es un patrón de programación que se remonta a aquellos programas creados empleando programación secuencial pura, donde un solo programador (o grupo de programadores) se sentaban a redactar una serie de pasos o instrucciones computacionales para ser realizados en perfecta secuencia de inicio a fin con la intención de obtener un último resultado.

En esta época (no creas que fue hace muchos años) las llamadas a los métodos y librerías provenían siempre de una fuente central que se encargaba de manipular todas las variables en un mismo programa. Posteriormente, se desarrollaron interfaces gráficas que se encargaban de manejar las entradas de datos al programa mientras que el flujo principal del programa se encargaba de proporcionar manejadores (handlers) de los eventos que ocurrían en la interfaz gráfica (activa algo al hacer click, al presionar esta tecla, al mover el mouse, etc.) mientras la interfaz se encuentra en un ciclo constante. De esta manera el control del programa es invertido, la interfaz gráfica se encarga de avisar al flujo principal de qué tiene que hacer y cómo sin necesidad de saber exactamente CÓMO se hace.

Si notas, las interfaces en Java pueden ayudarte a traspasar el control de una aplicación a agentes externos pero el concepto es aplicable a hilos demonio que esperan a que un evento ocurra para activarse, una clase que se encarga de instanciar y entregar implementaciones de otras clases al programa (patrón fábrica) y en esencia cualquier patrón que permita transmitir el control del programa a algún agente externo.

Inyección de Dependencias


Es un tipo particular de Inversión de Control en el cual una clase A no sabe qué objeto va a emplear al momento de ser compilado sino solamente conoce las acciones que tiene que tomar con dicho objeto. Supongamos la siguiente clase (que está basada en las clases creadas en mi tutorial anterior):

public class Dibujante {

	 public Cuadrado cuadrado;
	
	 public Dibujante() {
			 cuadrado = new Cuadrado();
	 }
	
	 public void DibujoMaestro(){
			 cuadrado.dibujar();
	 }
}

Como verás, esta clase “Dibujante” depende enteramente de la clase “Cuadrado” ya que está encargada del ciclo de vida del objeto cuadrado que posteriormente va a emplear. Esta forma de crear una clase “Dibujante” es muy poco práctica ya que si más adelante quisiéramos que el Dibujante dibujara rectángulos o triángulos tendríamos que modificar el código base para hacerlo.

En su lugar podemos crear una clase más reusable si implementamos la interface “Dibujable” que creamos en el tutorial anterior:

public class Dibujante {

	 public Dibujable dibujo;
	
	 public Dibujante(Dibujable d) {
			 dibujo = d;
	 }
	
	 public void DibujoMaestro(){
			 dibujo.dibujar();
	 }
}

De esta manera los objetos de la clase “Dibujante” no “controlan” el objeto que tienen que dibujar sino únicamente saben que implementa la interface Dibujable y, posteriormente, estos objetos “Dibujante” que vaya a crear en mi aplicación o que alguien más vaya a usar en una aplicación que acceda a mi librería de objetos son perfectamente capaces de recibir cualquier objeto que implemente la interfaz “Dibujable”.

En el ejemplo anterior se está aplicando lo que se conoce como “Constructor Inyection” ya que se inyecta la dependencia a nivel del constructor pero puedes Inyectar la dependencia a través de los “Setters” también o, en otros lenguajes de programación, puedes inyectar los parámetros o las interfaces (En Java no puedes modificar los parámetros ni las interfaces que acepta un método en tiempo de ejecución pero Python, por ejemplo, permite que los métodos acepten parámetros sin especificar el tipo de los parámetros).

public class Dibujante {

	 public Dibujable dibujo;
	
	 public void setDibujo(Dibujable d) {
			 dibujo = d;
	 }
	
	 public void DibujoMaestro(){
			 dibujo.dibujar();
	 }
}

La inyección de dependencias permite, esencialmente, una separación de las funcionalidades de tu programa. Esa independencia permite probar tus clases sin (valga la repetición) que tu clase esté atada a nada. Esta independencia es una de las piezas claves para usar Spring, los componentes dependen del framework y no de la aplicación, puedes crear objetos que existen ajenos a tu aplicación y usarlos únicamente cuando los necesitas.

Ya a partir del próximo tutorial empezaremos a trabajar directamente con Spring y verás cómo todos los conceptos que hemos visto hasta ahora se relacionan con su funcionamiento y te permitirán adquirir la experticia necesaria en poco tiempo.

Espero sus comentarios, Hasta la Próxima!

¿Te ayudó este Tutorial?


Sin comentarios, sé el primero!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X