Primavera - Iniezione di dipendenza

Ogni applicazione basata su Java ha alcuni oggetti che lavorano insieme per presentare ciò che l'utente finale vede come un'applicazione funzionante. Quando si scrive un'applicazione Java complessa, le classi dell'applicazione dovrebbero essere il più indipendenti possibile da altre classi Java per aumentare la possibilità di riutilizzare queste classi e per testarle indipendentemente da altre classi durante il test unitario. Dependency Injection (o talvolta chiamato cablaggio) aiuta a incollare queste classi insieme e allo stesso tempo a mantenerle indipendenti.

Considera di avere un'applicazione che ha un componente di editor di testo e di voler fornire un controllo ortografico. Il tuo codice standard sarebbe simile a questo -

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

Quello che abbiamo fatto qui è creare una dipendenza tra TextEditor e SpellChecker. In uno scenario di inversione del controllo, faremmo invece qualcosa del genere:

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

Qui, TextEditor non dovrebbe preoccuparsi dell'implementazione del correttore ortografico. Il correttore ortografico verrà implementato in modo indipendente e verrà fornito a TextEditor al momento della creazione di istanze di TextEditor. L'intera procedura è controllata da Spring Framework.

Qui, abbiamo rimosso il controllo totale da TextEditor e lo abbiamo mantenuto altrove (cioè file di configurazione XML) e la dipendenza (cioè classe SpellChecker) viene iniettata nella classe TextEditor attraverso un Class Constructor. Così il flusso di controllo è stato "invertito" da Dependency Injection (DI) perché hai effettivamente delegato le dipendenze a qualche sistema esterno.

Il secondo metodo per iniettare dipendenza è attraverso Setter Methodsdella classe TextEditor dove creeremo un'istanza SpellChecker. Questa istanza verrà utilizzata per chiamare i metodi setter per inizializzare le proprietà di TextEditor.

Pertanto, DI esiste in due varianti principali ei seguenti due sottocapitoli copriranno entrambi con esempi:

Sr.No. Tipo di inserimento delle dipendenze e descrizione
1 Inserimento delle dipendenze basato sul costruttore

La DI basata sul costruttore viene eseguita quando il contenitore richiama un costruttore di classi con un numero di argomenti, ognuno dei quali rappresenta una dipendenza dall'altra classe.

2 Inserimento delle dipendenze basato su setter

La DI basata su setter viene eseguita dal contenitore che chiama i metodi setter sui tuoi bean dopo aver richiamato un costruttore senza argomenti o un metodo factory statico senza argomenti per istanziare il tuo bean.

È possibile combinare DI sia basato su costruttore che basato su Setter, ma è una buona regola pratica utilizzare argomenti del costruttore per le dipendenze obbligatorie e setter per le dipendenze opzionali.

Il codice è più pulito con il principio DI e il disaccoppiamento è più efficace quando gli oggetti vengono forniti con le loro dipendenze. L'oggetto non cerca le sue dipendenze e non conosce l'ubicazione o la classe delle dipendenze, anzi tutto è curato dallo Spring Framework.