Para contestar la pregunta primero tenemos que definir que es una dependencia. Una dependencia es la necesidad que tiene una estructura de programación por otra estructura es decir son todos aquellos lazos que mantiene y necesita un programa o objeto “X” por otro programa, objeto, librería o clase.
Esto lo podemos ver cuando hacemos un import en Java todas las clases que se importan producen una dependencia en la clase que las importa.
Otro concepto importante a tomar en cuenta es la inversión de control (IoC) la cual invierte el control del programar a la hora de programar ya que como todos sabemos el programador tiene el control sobre la creación de instancias sobre la llamada a métodos y muchas cosas más. Ósea un muchos casos el programador realiza su flujo pero este puede ser cambiado por la arquitectura de la aplicación o por un ente externo según la teoría de IoC.
Ahora Inyección de dependencias es un tipo especial de IoC (Inversión de control) en el cual el programador no necesita estar creando instancias de un objeto estas son dadas por un ente externo ya sea este un contexto, un contenedor o una plataforma de programación.
Un ejemplo de una dependencia seria la siguiente.
public interface Persona{
public String getNombre();
}
public class Empleado implements Persona{
private String nombre = “Empleado”;
public String getNombre(){
return nombre;
}
}
import com.compañia.Persona;
public class Rol{
private Persona persona = new Empleado();
//Aquí ahí una dependencia hacia Persona y Empleado y una instancia que puede
//ser inyectada la instancia de empleado, ahora con dependencia de inyección
//podemos quitar la dependencia de empleados e invertir el control de quien
//instancia al empleado
}
Ahora el código de Inyección de dependencias varía según el Framework o arquitectura que usemos.
En seam por ejemplo podemos inyectar una instancia de un empleado con la anotación @In y podemos hacer ese componente accesible al contenedor de dependencias con la anotación @Name
Ejemplo:
@Name(“persona”) //aquí indicamos como se llama el componente en seam
public class Empleado implements Persona{
private String nombre = “Empleado”;
public String getNombre(){
return nombre;
}
}
public class Rol{
//aquí indicamos que inyecte un componente que tenga el nombre de la
//variable persona en cuyo caso para nosotros sería un objeto de tipo
//Empleado ahora la ventaja de esto es que nunca se tuvo una dependencia
//directa con la clase empleado y dicha clase se puede remplazar por
//cualquier otra implementación de persona sin que el sistema conozca la //clase implementadora.
@In
private Persona persona = null;
}