La inyección de dependencias es un patrón de programación que, a pesar de lo que mucha gente cree, no requiere ninguna anotación del tipo @Inject o @Autowired para aplicarse.
La idea del patrón es crear las dependencias de una clase en tiempo de ejecución en lugar de en la compilación.
Por ejemplo, supongamos la siguiente clase:
public class MiClase {
private List miLista;
public MiClase() {
this.miLista = new ArrayList();
}
}
La dependencia, miLista, se crea en el tiempo de compilación, ya que la propia clase es la encargada de la construcción de sus dependencias.
Mientras que en el siguiente ejemplo:
public class MiClase {
private List miLista;
public MiClase(List lista) {
this.miLista = lista;
}
}
Se inyecta la dependencia en tiempo de ejecución, ya que la dependencia miLista se le proporciona a la hora de crearse como parámetro en el constructor.
Existiría otro ejemplo donde la dependencia se le proporciona mediante un set.
public class MiClase {
private List miLista;
public void setMiLista(List miLista) {
this.miLista = lista;
}
}
La ventaja del patrón es que el código es más flexible, puesto que podemos proporcionar diferentes implementaciones de la interfaz, en este caso List, y no limitarnos a uno solo, como en el ejemplo sin dependencia.
Como punto negativo del patrón se añade un acoplamiento entre clases, puesto que se crea una dependencia entre la clase que construimos y la clase que le inyecta los valores necesarios para su construcción.