← Ir a portada

Inyección de dependencias con Spring

Observando detenidamente el otro día el blog me di cuenta de que no hay ningún post que hable directamente del concepto de inyección de dependencias sino que se da por suesto así que para cubrir este hueco voy a explicar el concepto y su implementación utilizando Spring.

¿Cuántas veces nos hemos visto obligados a realizar este tipo de cosas durante un programa en Java?

public class Clase{

private Clase2 atributo1;

public Clase(){

this.atributo1 = new Clase2();
}

}

Otras veces, solemos extender clases de manera innecesaria tal y como comenta mi colega Luis en el post Evita extender clases. Especialmente problemática es esta práctica cuando se trata de objetos DAO que crean una conexión a la BD ya que si cada usuario crea una conexión a la BD y el número de usuarios es alto pueden hacer que el servidor se caiga.

Para evitar esto, se propone como patrón la inyección de dependencias que radica en resolver las dependecias de cada clase (atributos) generando los objetos cuando se arranca la aplicación y luego inyectarlos en los demás objetos que los necesiten a través de métodos set o bien a través del constructor, pero estos objetos se instancian una vez, se guardan en una factoría y se comparten por todos los usuarios (al menos en el caso de Spring) y nos evitamos tener que andar extendiendo clases o tumbar el servidor de la BD.

Spring soporta inyección de dependencias a través del constructor y a través de métodos set pero se aconseja hacerlo a través de métodos set. Vamos a ver que habría que hacer para utilizar inyección de dependencias con Spring a través de métodos set.

public class Clase {

private Clase2 atributo1;

public Clase(){

}

public void setAtributo1(Clase2 atributo1){

this.atributo1 = atributo1;
}

}

public class Clase2 {

—IMPLEMENTACIÓN—

}

Declaramos nuestros beans en el contexto de la aplicación

< bean id="atributo1" class="org.mipaquete.bean.Clase2">

< /bean>

< bean id="atributo" class="org.mipaquete.bean.Clase">

< property name=" atributo1" ref="atributo1" / >
< /bean>

El atributo ref hace referencia al id del bean creado así que hay que tener un poco de cuidado con los ids. Esto es todo lo que hay que saber para uitilizar inyección de dependencias con Spring.

Al arrancar la aplicación estos beans serán creados y todas sus dependencias resuentas y en todas las partes de código en las que utilicemos un atributo de la clase Clase2 bastara con que le llamemos atributo1 y añadamos a la clase un método set y ese objeto será inyectado en tiempo de ejecución.

Se me había olvidado comentar que a la inyección de dependencias también se le llama Inverse of Control o simplemente IoC, pero a mí me parece más correcto el término inyección de dependencias y así me referiré a él en este blog.

Para más información sobre inyección de dependencias con Spring

Apuntes relacionados:

13 Respuestas a “Inyección de dependencias con Spring”

  1. Carolina Moreno dice:

    Vaya… ahora si entiendo mejor el concepto de inyeccion de dependencias, normalmente solo estaba desarrollando siguiendo la arquitectura del appfuse(un poco pesada por cierto) pero no lo entendiadel todo.. gracias

  2. Javi dice:

    Muchas gracias,
    muy útil.

  3. hector Vargas dice:

    he leido varios documentos acerca de la inyeccion de dependencias y de la inversion de control, y me quedan claros la implementacion de spring a nivel tecnico, pero, que tanto nos beneficia la implementacion de spring? osea, cual es la maxima bondad de este framework? o cual la recomendacion para usarlo? que nos ahorramos? memoria, recursos procesamiento?

  4. Yo no he probado todo su potencial, pero sí muchas cosas, para empezar evita el que tengas que poner todos los incómodos try y catch de JDBC ya que agolpa todas las excepciones en una propia de tipo Runtime, con lo que se trata a nivel de aplicación.

    Por otro lado, permite configurar la Transaccionalidad de manera declarativa y el se encarga abrir y cerrar las conexiones a la BD.

    Además tiene plantillas para trabajar con los principales ORMs(Ibatis, Hibernate,etc) y para trabajar con JDBC plano liberándote de ese código repetitivo y cansino.

    Todo ello hacen que tu código sea más limpio y legible y que en tus métodos de la lógica de negocio sólo haya lógica de negocio, no cosas que contaminen, como abrir/cerrar transaciones y conexiones e incómodos bloques try/catch.

    Es decir, hace muchas cosas beneficiosas y para ello se vale de la inyección de dependencias y la programación orientada a aspectos como herramienta.

    Espero haber contestado a tu pregunta.

    Un saludo

  5. [...] Otro artículo revisando las ventajas de éstas nuevas funcionalidades. Por un lado comenta las ventajas evidentes de usarlo con array_map, array_reduce, etc… y por otro lado analiza la manera de utilizarlo como forma de inyección de dependencias. [...]

  6. Luis dice:

    Ahora si entiendo, sos Grandeee! :D

  7. Arturex dice:

    Excelente post…, se entiende a la perfección, gracias Raul

  8. ermucia dice:

    Hola,

    Necesito ayuda. Raul Vicente comenta :
    q Spring hace muchas cosas beneficiosas y para ello se vale de la inyección de dependencias y la programación orientada a aspectos como herramienta.
    ¿Q es la prog. orientada a aspectos?

    Gracias y un saludo.

  9. Fernando dice:

    Muy claro, sencillo, y justo lo que se necesita. Gracias.

  10. Rene dice:

    Muchas gracias ahora se a que se refieren cuan cuando hablan de inyeccion de dependencias

  11. franco dice:

    Muy bueno la verdad, lo mas claro que eh leido hasta ahora!!

  12. Cesar dice:

    En mi trabajo anterior, desarrollabamos en base al patrón MVC, sin utilizar algún framework, ya que la persona que inicio los proyectos era principiante, y lamentablemente me adecué a ese tipo de trabajo. Ahora, estoy 100% convencido que Spring es una ayuda bárbara, nos ahorra tiempo de desarrollo y ,además, lineas de código. Con este post, ha aclarado muchas de mis dudas.Gracias

Deja un comentario