Spring - Injection de dépendances

Chaque application Java possède quelques objets qui fonctionnent ensemble pour présenter ce que l'utilisateur final considère comme une application fonctionnelle. Lors de l'écriture d'une application Java complexe, les classes d'application doivent être aussi indépendantes que possible des autres classes Java pour augmenter la possibilité de réutiliser ces classes et de les tester indépendamment des autres classes lors des tests unitaires. L'injection de dépendance (ou parfois appelée câblage) aide à coller ces classes ensemble et en même temps à les maintenir indépendantes.

Considérez que vous avez une application qui a un composant éditeur de texte et que vous souhaitez fournir une vérification orthographique. Votre code standard ressemblerait à ceci -

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

Ce que nous avons fait ici, c'est créer une dépendance entre TextEditor et SpellChecker. Dans un scénario d'inversion de contrôle, nous ferions plutôt quelque chose comme ceci -

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

Ici, TextEditor ne doit pas s'inquiéter de l'implémentation de SpellChecker. Le SpellChecker sera implémenté indépendamment et sera fourni à TextEditor au moment de l'instanciation de TextEditor. Toute cette procédure est contrôlée par Spring Framework.

Ici, nous avons supprimé le contrôle total de TextEditor et l'avons conservé ailleurs (c'est-à-dire fichier de configuration XML) et la dépendance (c'est-à-dire la classe SpellChecker) est injectée dans la classe TextEditor via un Class Constructor. Ainsi, le flux de contrôle a été «inversé» par l'injection de dépendances (DI) parce que vous avez effectivement délégué des dépendances à un système externe.

La deuxième méthode d'injection de dépendance consiste à Setter Methodsde la classe TextEditor où nous allons créer une instance SpellChecker. Cette instance sera utilisée pour appeler des méthodes setter pour initialiser les propriétés de TextEditor.

Ainsi, DI existe en deux grandes variantes et les deux sous-chapitres suivants les couvriront tous les deux avec des exemples -

N ° Sr. Type et description d'injection de dépendance
1 Injection de dépendances basée sur un constructeur

La DI basée sur un constructeur est effectuée lorsque le conteneur appelle un constructeur de classe avec un certain nombre d'arguments, chacun représentant une dépendance à l'autre classe.

2 Injection de dépendances basée sur un poseur

La DI basée sur un Setter est accomplie par le conteneur qui appelle les méthodes setter sur vos beans après avoir appelé un constructeur sans argument ou une méthode de fabrique statique sans argument pour instancier votre bean.

Vous pouvez mélanger les deux DI, basée sur constructeur et basée sur Setter, mais c'est une bonne règle de base d'utiliser des arguments de constructeur pour les dépendances obligatoires et des setters pour les dépendances facultatives.

Le code est plus propre avec le principe DI et le découplage est plus efficace lorsque les objets sont fournis avec leurs dépendances. L'objet ne recherche pas ses dépendances et ne connaît pas l'emplacement ou la classe des dépendances, mais tout est pris en charge par Spring Framework.