Primavera - Inyección de dependencia

Cada aplicación basada en Java tiene algunos objetos que trabajan juntos para presentar lo que el usuario final ve como una aplicación funcional. Al escribir una aplicación Java compleja, las clases de aplicación deben ser lo más independientes posible de otras clases de Java para aumentar la posibilidad de reutilizar estas clases y probarlas independientemente de otras clases durante las pruebas unitarias. La inyección de dependencia (o en ocasiones llamada cableado) ayuda a unir estas clases y al mismo tiempo a mantenerlas independientes.

Considere que tiene una aplicación que tiene un componente de editor de texto y desea proporcionar un corrector ortográfico. Su código estándar se vería así:

public class TextEditor {
   private SpellChecker spellChecker;
   
   public TextEditor() {
      spellChecker = new SpellChecker();
   }
}

Lo que hemos hecho aquí es crear una dependencia entre TextEditor y SpellChecker. En un escenario de inversión de control, haríamos algo como esto:

public class TextEditor {
   private SpellChecker spellChecker;
   
   public TextEditor(SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }
}

Aquí, el TextEditor no debería preocuparse por la implementación de SpellChecker. El SpellChecker se implementará de forma independiente y se proporcionará al TextEditor en el momento de la instanciación de TextEditor. Todo este procedimiento está controlado por Spring Framework.

Aquí, hemos eliminado el control total del TextEditor y lo hemos mantenido en otro lugar (es decir, el archivo de configuración XML) y la dependencia (es decir, la clase SpellChecker) se está inyectando en la clase TextEditor a través de un Class Constructor. Por lo tanto, el flujo de control ha sido "invertido" por la inyección de dependencia (DI) porque efectivamente ha delegado dependencias a algún sistema externo.

El segundo método de inyectar dependencia es a través de Setter Methodsde la clase TextEditor donde crearemos una instancia SpellChecker. Esta instancia se utilizará para llamar a los métodos de establecimiento para inicializar las propiedades de TextEditor.

Por lo tanto, DI existe en dos variantes principales y los dos subcapítulos siguientes cubrirán ambos con ejemplos:

No Señor. Tipo de inyección de dependencia y descripción
1 Inyección de dependencia basada en constructor

La DI basada en constructores se logra cuando el contenedor invoca un constructor de clase con varios argumentos, cada uno de los cuales representa una dependencia de la otra clase.

2 Inyección de dependencia basada en setter

La DI basada en Setter se logra mediante el contenedor que llama a los métodos de setter en sus beans después de invocar un constructor sin argumentos o un método de fábrica estático sin argumentos para instanciar su bean.

Puede mezclar DI basado en constructor y basado en Setter, pero es una buena regla general usar argumentos de constructor para dependencias obligatorias y establecedores para dependencias opcionales.

El código es más limpio con el principio DI y el desacoplamiento es más efectivo cuando los objetos cuentan con sus dependencias. El objeto no busca sus dependencias y no conoce la ubicación o la clase de las dependencias, sino que Spring Framework se encarga de todo.