Setter DI vs. constructeur DI au printemps?

Printemps a deux types de DI: le setter de la DI et de la construction de DI.

di basé sur le constructeur fixe l'ordre dans lequel les dépendances doivent être injectées. Le DI basé sur Setter n'offre pas cela.

Setter-based DI nous aide à injecter la dépendance seulement quand elle est nécessaire, au lieu de l'exiger au moment de la construction.

Je ne vois pas d'autres différences significatives, car les deux types de ressorts DI fournissent le même features-setter et le constructeur injectent la dépendance lorsque le code démarre. Certes, le constructeur DI le fera par l'intermédiaire du constructeur tandis que setter DI le fera par l'intermédiaire d'un setter immédiatement après la construction de l'objet, mais cela ne fait aucune différence pour le développeur en termes de performances, etc. Les deux offrent également des moyens de spécifier l'ordre d'injection de la dépendance.

je suis à la recherche d'un scénario où l'on offre un net avantage sur l'autre, ou encore lorsqu'un type est complètement inutilisable.

19
demandé sur mskfisher 2011-10-15 21:42:57

7 réponses

quand il s'agit de ressorts spécifiques pour et contre:

  • Constructeur de l'injection (à partir de la définition) ne vous permet pas de créer des dépendances circulaires entre les haricots. Cette limitation est en fait un avantage du constructeur injection-Spring peut résoudre les dépendances circulaires lorsque setter injection est utilisé sans que vous ne le remarquiez.

  • d'autre part si vous utilisez l'injection de constructeur CGLIB n'est pas capable de créer un proxy, vous forçant à utiliser soit des proxies basés sur l'interface, soit un constructeur fictif no-arg. Voir: SPR-3150

21
répondu Tomasz Nurkiewicz 2011-10-15 17:48:42

vous devriez décider en fonction de considérations de conception, pas de l'outil (ressort) considérations. Malheureusement, Spring nous a appris à utiliser setter injection parce que lorsqu'il a été conçu à l'origine, il n'y avait pas de "annotation" en Java, et en XML, setter injection fonctionne et semble beaucoup mieux. Aujourd'hui, nous sommes libérés de ces contraintes, ce qui nous permet de prendre une nouvelle décision en matière de conception. Vos haricots devraient utiliser l'injection de constructeur pour toutes les dépendances qui sont exigées par le bean et setter injection pour les dépendances qui sont optionnelles et ont un défaut raisonnable, plus ou moins comme OOD nous l'a dit depuis le début.

13
répondu Ryan Stewart 2011-10-15 17:50:22

injection du constructeur: nous injectons les dépendances par L'intermédiaire du constructeur.

Généralement, nous pouvons utiliser pour dépendances obligatoires.

si vous utilisez l'injection du constructeur, il y a un inconvénient appelé "dépendance circulaire".

dépendance circulaire: supposer A et B. A est dépendante sur B. B dépend de A. Dans ce constructeur injection sera échoué. À ce moment-là, Setter injection est utile.

si L'État de L'objet n'est pas incohérent, il ne créera pas d'objet.

Setter Injection: nous injectons les dépendances par des méthodes de Setter.

c'est utile pour dépendances Non-obligatoires.

il est possible de re injection des dépendances en utilisant Setter Injection. Il est pas possible dans Constructeur d'injection.

7
répondu Ranga Reddy 2014-03-06 09:55:25

Préfèrent l'injection par mutateur.

pense à ce qui se passerait sans spring (comme Ryan l'a noté). Passeriez-vous les dépendances dans le constructeur? Si il y a trop de dépendances cela semble mauvais. D'un autre côté, le constructeur peut être utilisé pour renforcer l'état valide de l'objet - require toutes les dépendances et vérifier si elles ne sont pas nulles.

Proxies sont une autre chose (comme Tomasz l'a noté) - vous aurez besoin d'un constructeur fictif qui bat l'ensemble idée.

il y a une troisième option btw - injection de champ. J'ai tendance à utiliser cela, bien que ce ne soit pas une bonne décision de conception, parce qu'il sauve un setter supplémentaire, mais si ce est utilisé en dehors du printemps, je vais devoir ajouter le setter.

0
répondu Bozho 2011-10-15 18:37:18

puisque vous pouvez mélanger les deux,

constructeur DI - et Setter-based DI ,

c'est une bonne règle empirique pour utiliser les arguments du constructeur pour les dépendances obligatoires et les setters pour les dépendances optionnelles .



Note que l'utilisation d'une annotation @requise sur un setter peut être utilisé pour rendre les setters nécessaires des dépendances.

0
répondu VedX 2014-11-20 04:03:44

selon le contenu du ressort.io à partir du printemps 5

puisque vous pouvez mélanger le DI basé sur le constructeur et le DI basé sur le setter, c'est une bonne règle empirique d'utiliser les constructeurs pour les dépendances obligatoires et les méthodes de setter ou les méthodes de configuration pour les dépendances optionnelles. 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 requise.

l'équipe de Spring préconise généralement l'injection du constructeur permet d'implémenter des composants d'application comme des objets immuables et de s'assurer que les dépendances requises ne sont pas nulles. De plus, les composants injectés par le constructeur sont toujours retournés au code client (appelant) dans un état entièrement initialisé. Comme note d'accompagnement, un grand nombre d'arguments de constructeur est une mauvaise odeur de code, ce qui implique que la classe a probablement trop de responsabilités et devrait être remanié pour mieux répondre à la séparation appropriée des préoccupations.

L'injection de Setter

ne doit être utilisée principalement que pour les dépendances optionnelles auxquelles on peut attribuer des valeurs par défaut raisonnables dans la classe. Dans le cas contraire, des vérifications non nulles doivent être effectuées partout où le code utilise la dépendance. L'un des avantages de l'injection de setter est que les méthodes de setter rendent les objets de cette classe susceptibles d'être reconfigurés ou réinjectés plus tard. La prise en charge par JMX MBeans est donc un argument convaincant en faveur de l'injection de setter.

voici le lien pour la citation ci-dessus

mais, tous les types d'injections sont disponibles et aucun d'eux n'est déprécié. À un niveau élevé, vous obtenez la même fonctionnalité pour tous les types d'injection.

en bref, choisissez le type d'injection qui fonctionne le mieux pour votre équipe et votre projet.

les recommandations de L'équipe de printemps et les billets de blog indépendant varieront au fil du temps. Il n'est pas dur rapide règle.

si un type d'injection particulier n'était pas recommandé par l'équipe du ressort, elle le qualifierait d'obsolète ou d'obsolète. Ce n'est le cas d'aucun des styles d'injection.

0
répondu damndemon 2018-08-03 10:13:04

non, même L'Injection par le constructeur se produit, l'injection fonctionne toujours, mais l'initialisation limitée, l'injection par setter est optionnelle et flexible. mais il peut généralement pour la classe de paramètre , un haricot de printemps avec d'autres haricots de printemps

-1
répondu user3016087 2014-09-15 15:14:11