2
votes

Injection de ressort de réglage non obligatoire

J'ai lu qu'il n'y a aucune garantie dans une injection de setter que la dépendance sera injectée par opposition à l'injection de constructeur que la dépendance est obligatoire.

Je ne comprends vraiment pas ce point. Si j'écris la méthode suivante:

@Autowired
public void setMyBean(MyBean otherBean){
    this.otherBean = otherBean;
}

qu'est-ce que cela signifie que otherBean ne sera pas injecté?


2 commentaires

où avez-vous lu cela?


Alors pourquoi avons-nous besoin du drapeau requis? Câblé automatiquement (obligatoire = faux) ? par défaut, il est vrai et spring ne parviendra pas à charger l'application si aucun bean trouvé lors de l'injection.


3 Réponses :


0
votes

DI existe en deux variantes majeures: Injection de dépendances basée sur le constructeur et Injection de dépendances basée sur un poseur .

Injection de dépendances basée sur le constructeur

La DI basée sur un constructeur est réalisée par le conteneur appelant un constructeur avec un certain nombre d'arguments, chacun représentant une dépendance.

Injection de dépendances basée sur un poseur

La DI basée sur les Setter est accomplie par le conteneur appelant des 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.

Encore une fois, l'injection de constructeur garantit que toutes les propriétés obligatoires ont été satisfaites, et il n'est tout simplement pas possible d'instancier un objet dans un état invalide (n'ayant pas passé ses collaborateurs). En d'autres termes, lorsque vous utilisez l'injection de constructeur, vous n'avez pas besoin d'utiliser un mécanisme dédié pour vous assurer que les propriétés requises sont définies (autres que les mécanismes Java normaux).

Mais dans l'injection basée sur un setter, si les dépendances ne sont pas trouvées, l'objet est créé, mais l'objet dépendant sera nul. Cela signifie que l'injection de setter n'assure pas l'injection de dépendance. Vous pouvez trouver un article détaillé ici .

Notez que l'utilisation de L'annotation @Required sur une méthode setter peut être utilisée pour faire de la propriété une dépendance obligatoire.


0 commentaires

0
votes

si vous utilisez l'injection basée sur un setter dans votre bean, votre bean s'initialisera, que toutes les dépendances aient été résolues ou non, mais vous obtiendrez NPE lorsque vous essayez d'utiliser ces dépendances non résolues / initialisées dans votre code. Mais dans l'injection basée sur le constructeur, votre bean sera initialisé une fois que toutes les dépendances auront été résolues.


0 commentaires

0
votes

Chaque fois que nous utilisons @Autowired , Spring s'assure que le bean pertinent existe et qu'il est injecté pour être utilisé. Si cela ne peut pas être fait, Spring lève une exception et l'application ne démarre pas.
La déclaration fait en fait référence au test de votre code. Je veux dire par là que si vous utilisez l'injection de dépendances basée sur setter , il est possible que l'on oublie d'injecter le bean requis et que les cas de test correspondants échouent.

L'injection de dépendances basée sur le constructeur garantit que l'on doit init tous les beans requis avant d'utiliser réellement le code requis.

Vous pouvez le lire en détail sur ici


0 commentaires