J'ai lu dans certains articles sur Spring MVC et les portlets que l' injection de champ n'est pas recommandée. Si je comprends bien, l' injection de champ se produit lorsque vous injectez un Bean avec @Autowired
comme ceci:
@Component
public class MyComponent {
@Autowired
private Cart cart;
}
Au cours de mes recherches, j'ai également lu sur l' injection de constructeur :
@Component
public class MyComponent {
private final Cart cart;
@Autowired
public MyComponent(Cart cart){
this.cart = cart;
}
}
Quels sont les avantages et les inconvénients de ces deux types d'injections?
EDIT 1: Comme cette question est marquée comme un double de cette question, je l'ai vérifiée. Parce qu'il n'y a pas d'exemples de code ni dans la question ni dans les réponses, je ne sais pas si j'ai raison de deviner quel type d'injection j'utilise.
Date(int,int,int)
existe.Réponses:
Types d'injection
Il existe trois options pour la manière dont les dépendances peuvent être injectées dans un bean:
Vous utilisez l'option 3. C'est ce qui se passe lorsque vous utilisez
@Autowired
directement sur votre terrain.Directives d'injection
Une directive générale, qui est recommandée par Spring (voir les sections sur la DI basée sur le constructeur ou la DI basée sur le Setter ) est la suivante:
Inconvénients de l'injection sur le terrain
Les raisons pour lesquelles l'injection de champ est mal vue sont les suivantes:
Conclusion
Selon vos besoins, vous devez principalement utiliser l'injection de constructeur ou un mélange d'injection de constructeur et de setter. L'injection de champ présente de nombreux inconvénients et doit être évitée. Le seul avantage de l'injection de champ est qu'elle est plus pratique à écrire, ce qui ne l'emporte pas sur tous les inconvénients.
Lectures complémentaires
J'ai écrit un article de blog sur les raisons pour lesquelles l'injection de champ n'est généralement pas recommandée: Injection de dépendance de champ considérée comme nuisible .
la source
Il s'agit de l'une des discussions sans fin dans le développement de logiciels, mais les principaux influenceurs de l'industrie sont de plus en plus avisés sur le sujet et ont commencé à suggérer l'injection de constructeur comme meilleure option.
Injection de constructeur
Avantages:
Les inconvénients:
Fondamentalement, l'injection de champ est le contraire.
la source
Question de goût. C'est votre décision.
Mais je peux expliquer pourquoi je n'utilise jamais l' injection de constructeur .
Je ne veux pas mettre en œuvre un constructeur pour tous mes
@Service
,@Repository
et les@Controller
haricots. Je veux dire, il y a environ 40 à 50 haricots ou plus. Chaque fois que j'ajoute un nouveau champ, je devrais étendre le constructeur. Non, je n'en veux pas et je n'ai pas à le faire.Et si votre Bean (Service ou Controller) nécessite l'injection de beaucoup d'autres beans? Un constructeur avec plus de 4 paramètres est très moche.
Si j'utilise CDI, le constructeur ne me concerne pas.
EDIT # 1 : Vojtech Ruzicka a déclaré:
Oui. Théorie et réalité. Voici un exemple:
DashboardController
mappé sur un seul chemin*:8080/dashboard
.My
DashboardController
recueille beaucoup d'informations d'autres services pour les afficher dans un tableau de bord / une page de présentation du système. J'ai besoin de ce contrôleur unique. Je ne dois donc sécuriser que ce chemin (filtre d'authentification de base ou de rôle d'utilisateur).EDIT # 2 : Puisque tout le monde se concentre sur les 8 paramètres du constructeur ... C'était un exemple réel - un code hérité des clients. J'ai changé ça. La même argumentation s'applique à moi pour 4+ paramètres.
Tout est question d'injection de code, pas de construction d'instances.
la source
Un autre commentaire - Vojtech Ruzicka a déclaré que Spring injectait des haricots de trois manières (la réponse avec le plus grand nombre de points):
Cette réponse est fausse - parce que POUR CHAQUE TYPE D'INJECTION, LE RESSORT UTILISE LA RÉFLEXION! Utilisez IDE, définissez le point d'arrêt sur le poseur / constructeur et vérifiez.
Cela peut être une question de goût mais cela peut aussi être une question de CAS. @dieter a fourni un excellent cas où l'injection sur le terrain est meilleure. Si vous utilisez l'injection de champ dans les tests d'intégration qui configurent le contexte Spring - l'argument avec la testabilité de la classe est également invalide - à moins que vous ne souhaitiez écrire plus tard des tests dans vos tests d'intégration;)
la source