Weld, l'implémentation de référence JSR-299 Contexts and Dependency Injection, se considère comme une sorte de successeur de Spring and Guice.
CDI a été influencé par un certain nombre de frameworks Java Java, y compris Seam, Guice et Spring. Cependant, CDI a son propre caractère, très distinct: plus sûr pour les types que Seam, plus dynamique et moins XML- centrée sur Spring, plus web et capable d’applications d’entreprise que Guice. Mais cela n’aurait pas pu être sans l’inspiration des frameworks mentionnés et beaucoup de collaboration et de travail acharné par le JSR-299 Expert Group (EG).
http://docs.jboss.org/weld/reference/latest/en-US/html/1.html
Qu'est-ce qui rend Weld plus capable pour les applications d'entreprise que Guice? Y a-t-il des avantages ou des inconvénients par rapport à Guice? Que pensez-vous du Guice AOP par rapport aux intercepteurs Weld? Et la performance?
Mon choix
En fin de compte, j'ai décidé d'utiliser Guice parce que j'aime le modèle de programmation propre qui vient presque sans annotations en plus de @Inject par défaut. Il est beaucoup plus facile d'utiliser des bibliothèques externes avec Guice qu'avec CDI. AOP est également assez simple avec Guice.
Avant d'essayer de répondre à votre question, permettez-moi d'ajouter une information importante: JSR 3 (@Inject
) a été normalisé par les projets Guice et Spring ( annonce de mai 2009 ) et est réutilisé dans JSR 299 . Cela couvre les mécanismes DI de base en termes de déclaration d'un point d'injection.
Maintenant, revenons à la question - avec l'avertissement que j'ai beaucoup plus d'expérience avec Spring qu'avec Guice.
Capacités d'entreprise dans Weld
beans.xml
).Avantages/inconvénients
Remarque: je vais essayer d'ajouter quelques éléments ici plus tard, mais cette réponse est déjà plus longue que ce à quoi je m'attendais, désolé.
Soudure/CDI
Guice/Spring
AOP et intercepteurs
C'est un sujet très discuté et je ne peux pas privilégier l'un plutôt que l'autre. Les deux mécanismes sont très puissants mais nécessitent au moins une compréhension minimale de l'architecture de l'application. Regardez aussi Decorators et le Events précédemment référencé. Il est préférable d'utiliser le bon outil, mais n'oubliez pas que si un développeur doit travailler avec l'un de ces mécanismes, c'est une bonne chose s'il comprend le concept.
Performances
Malheureusement, je n'ai pas encore pu examiner cela, mais il y a quelques règles que j'essaie de suivre, surtout lorsque j'utilise un framework qui vous donne beaucoup de fonctionnalités sans que vous le remarquiez:
CDI (Weld) n'a pas encore été largement utilisé, il est donc difficile de faire une comparaison. Quelques points:
CDI pour les utilisateurs de Guice est une belle comparaison.
La caractéristique la plus importante que CDI s'est opposée à Guice est qu'il s'agit d'une partie standard de Java EE 6.
L'importance de cela ne peut pas être sous-estimée, car cela signifie que CDI est la norme DI que vous devez utiliser lors du codage des applications Web.
Il y a quelque temps, j'ai jeté un œil aux technologies pour déterminer comment nous pourrions avoir une distribution de base standard - convenablement préparée - où nous pourrions ajouter des modules supplémentaires à volonté qui pourraient remplacer les fonctionnalités existantes sans avoir à changer les modules de base. C'est à dire. ajoutez un pot supplémentaire et la fonctionnalité s'activera automatiquement.
Il s'est avéré que la meilleure façon pour nous de le faire pour une base de code utilisée dans les applications de bureau et Web, était d'utiliser les annotations JSR-330 pour notre code, puis d'utiliser soit CDI ou Guice (SVN, bientôt très bientôt 3.0) comme moteur.
Après quelques projets, j'ai trouvé que j'aime mieux la configuration Guice que la magie opaque qui se passe dans Weld. De plus, j'ai trouvé que la façon de faire ce que nous voulons comme décrit ci-dessus avec Weld, je dois marquer la classe dans le pot supplémentaire comme @Alternative, puis mentionner dans beans.xml que je veux que la classe alternative soit appliquée (et ce n'est pas robuste contre refactoring).
Mais, dans l'ensemble, JSR-330 nous permet de faire quelque chose qui était très fastidieux et fragile auparavant (parce que new
se lie si extrêmement étroitement), et c'est une grande victoire. Je peux fortement recommander d'examiner DI si vous avez un besoin comme celui-ci.
Un autre différenciateur est que CDI est très Java EE orienté. Il fournit un mécanisme pour coller les différents sous-systèmes Java EE ensemble).
C'est à dire. En annotant un bean avec @Named("book")
, le bean devient connu dans le EL unifié (Expression Language) comme 'book
'.
Ensuite, vous pouvez l'utiliser dans une page JSF par exemple:
<h:outputLabel value="Book title:" for="bookTitle"/>
<h:outputText id="bookTile" value="#{book.title}"/>
J'ai utilisé Guice dans une application sans serveur AWS Lambda. AWS recommande d'utiliser Guice ou Dagger sur Spring dans une fonction Lambda. Voir meilleures pratiques AWS Lambda
La raison principale est que Guice et Dagger sont des cadres plus petits et ont un temps de démarrage plus rapide, ce qui est essentiel dans Lambda.
Bien que l'OP n'ait pas mentionné Spring, Spring et CDI/weld sont destinés aux applications de niveau entreprise, qui nécessitent souvent des fonctionnalités supplémentaires fournies par ces frameworks. Par conséquent, pour les petites applications, qui ne nécessitent que DI, Guice ou Dagger serait optimale.