Inyección de Dependencias

La Inyección de Dependencias es un patrón de diseño que ha ido ganando , en la última década 1), mucha aceptación entre los programadores , especialmente en la comunidad Java.

La Inyección de Dependencias es parte de un concepto mas amplio llamado Inversión del control , aunque en mucha gente los suele utilizar como sinónimos.Para simplificar la explicación nosotros también vamos a tratarlos como cosas equivalentes aunque sea un concepto erróneo .

La Inyección de Dependencias ( o la Inversión del control) se basa en que, en vez de que una clase vaya a buscar los objetos que necesita llamando a métodos que se los proporcionan, se hace al reves, siendo estos últimos los que se asignan automáticamente al objeto.

Para conseguir la Inyección de Dependencias lo más normal es que tengamos un framework que nos permite automatizar y simplicar la tarea.

Antes de ver el código Java vamos a poner un par de ejemplos cotidianos sobre el concepto de Inversión del control:

  • En vez de ir a una oficina a que te hagan un seguro para el coche, que sea el agente de seguros el que viene a tu casa para hacerte el seguro.
  • Cuando después de pasar una noche con una chica que acabas de conocer y que te ha gustado, le dices que la llamarás al día siguiente y ella te contesta, no te preocupes ya te llamaré yo.
  • Si en vez de ir a tu al médico cuando estás enfermo , es el médico el que viene a tu casa.

Como podemos ver , los resultados son prácticamente lo mismo si hacemos las cosas de forma normal o invertimos la forma de hacerlo 2).

Veamos el siguiente código Java:

public class PruebaIoC {
  ProfesorDAO profesorDAO=new ProfesorDAOImplHibernate();
  SessionFactory sessionFactory=HibernateUtil.getSessionFactory(); 
}

  • Línea 1: Para crear el objeto del interfaz ProfesorDAO usamos la orden new e indicamos el nombre de la clase que implementa el interfaz que es ProfesorDAOImplHibernate
  • Línea 2: Para crear el objeto del interfaz SessionFactory usamos el método estático getSessionFactory() de la clase HibernateUtil.

¿Cual son los problemas de estas 2 líneas? Obviamente, la línea ProfesorDAO profesorDAO=new ProfesorDAOImplHibernate() es bastante lamentable ya que estamos atando el código de PruebaIoC a una implementación concreta del interfaz ProfesorDAO. Éso se debe evitar a toda costa , aunque una solución es crear otra clase de factoría del interfaz ProfesorDAO.

Ésto nos lleva a preguntarnos , ¿qué tiene de malo la llamada a getSessionFactory()?

Pues que el código de PruebaIoC está acoplado a la clase HibernateUtil cuando realmente no la queremos para nada. Lo que PruebaIoC necesita es un SessionFactory y no debería saber nada sobre HibernateUtil. HibernateUtil podría ser subtituida por cualquier otra y no debería afectar nunca a PruebaIoC ya que no la necesita.

¿Cómo lo solucionamos?

Pues con la Inyección de Dependencias. La clase quedará ahora de la siguiente manera:

public class PruebaIoC {
    SessionFactory sessionFactory;
    ProfesorDAO profesorDAO;
}

Vemos cómo ahora sólo se declaran las 2 propiedades. El framework de Inyección de Dependencias que usemos, automáticamente asignará los valores a las 2 propiedades sin que la clase PruebaIoC sepa de dónde han salido. Es decir, que hemos eliminado las dependencias a HibernateUtil y hemos evitado incluir en el código la implementación concreta del interfaz ProfesorDAO.

Otra de las ventajas de la Inyección de Dependencias es relativa a las pruebas automáticas pero éste es un tema demasiado amplio en el no nos vamos a meter. Más información se puede encontrar en otro curso que impartí sobre integración contínua en:

Referencias

1) Mi opinión personal es que la Inversión del control y la Inyección de Dependencias se empezaron a popularizar con la publicación del libro Expert One-on-One J2EE Design and Development escrito por Rod Johnson, creador de Spring, y por el artículo de Martin Fowler Inversion of Control Containers and the Dependency Injection pattern
2) Aunque no está muy claro es si al final la chica te llamará :-)
patrones/di.txt · Última modificación: 2014/09/09 09:24 por admin
Ir hasta arriba
CC Attribution-Share Alike 3.0 Unported
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0