Wir planen, eine Webanwendung von Grund auf neu zu schreiben. Es wurde beschlossen, die neueste Ausgabe von Glassfish zu verwenden, die dem Java EE 6-Standard entspricht. Daher analysieren wir, ob CDI anstelle von Spring verwendet werden kann.
Können wir sagen, dass CDI ein Ersatz für Spring sein könnte?
Antworten:
CDI steht für "Kontext- und Abhängigkeitsinjektion", während Spring ein vollständiges Ökosystem um einen Abhängigkeitsinjektionsbehälter ist. Um beide zu vergleichen, müssen Sie den Vergleich unterscheiden.
Die Abhängigkeitsinjektion wird von beiden Containern übernommen. Der Hauptunterschied ist die Tatsache, dass CDI DI dynamisch (auch bekannt als Stateful) behandelt. Dies bedeutet, dass Abhängigkeiten zur Ausführungszeit aufgelöst werden . Der Ansatz von Spring ist statisch - dies bedeutet, dass die Komponenten zur Erstellungszeit miteinander verdrahtet werden . Während der CDI-Weg auf den ersten Blick etwas ungewöhnlich erscheint, ist er weit überlegen und bietet weitaus mehr und erweiterte Optionen (ich schreibe dies vor dem Hintergrund von zwei produktiven CDI-Apps).
Wenn Sie sich das Ökosystem ansehen , ist die Situation anders: Der Frühling wird mit vielen Gläsern (> 150) gebündelt , während der CDI für sich genommen ziemlich klein ist. Eine typische CDI-Verwendung befindet sich in einem Java EE 6-Anwendungsserver. Sie können sie jedoch problemlos in einer Servlet-Engine oder sogar in Java SE verwenden. Dies bedeutet, dass bei der Verwendung von CDI keine Annahme über die Verwendung von Hibernate, JPA, EJB oder was auch immer gemacht wird - das liegt bei Ihnen.
Wenn Sie mehr Funktionalität benötigen, wird CDI mit dem Konzept portabler Erweiterungen geliefert (wodurch sich die API lohnt). Es gibt unabhängige Erweiterungsmodule wie Apache CODI und Seam 3, die Themen wie Sicherheit, Mailing, Berichterstellung und mehr abdecken.
Zusammenfassend lässt sich sagen, dass CDI kein "Ersatz" für das Spring-Ökosystem ist, sondern vielmehr eine Verbesserung gegenüber dem Abhängigkeitsinjektionsmechanismus von Spring. Es ist Teil von Java EE 6, wenn Sie also mit Java EE 6 auf einem GlasFish sind, sollten Sie sich auf jeden Fall für CDI entscheiden. In meinen Augen lautet Ihre Frage eher: Kann ich Spring durch Java EE 6 ersetzen? Ich denke meine Antwort ist ziemlich offensichtlich ;-)
Schauen Sie sich Weld an, um einen guten Start zu haben ...
quelle
The @Inject annotation lets us define an injection point that is injected during bean instantiation.
ist dynamische Injektion nach meinem Verständnis eine Injektion, die mehr als einmal erfolgt. Es tritt jedes Mal auf, wenn eine Geschäftsmethode für diese Komponente aufgerufen wird. Auch für michstateful way inyection
bedeutet die Fähigkeit, die Injektion von Bohnen aus verschiedenen Kontexten zu handhaben, es verwendet Proxys, die auf die "richtige" Instanz jeder Bohne verweisenSpring's approach is static
. Ich denke nicht, dass dies (zumindest derzeit) völlig korrekt ist. Spring bietet auch andere Bereiche (z. B. denprototype
Bereich), mit denen Beans und Drähte zur Laufzeit während der Ausführung der Anforderung aufgelöst werden.Frühling ist mehr als nur ein Abhängigkeitsinjektionsbehälter. Es enthält außerdem Tools für AOP, Vorlagen zur Verwendung mit JPA, SQL usw. und vieles mehr.
CDI kann jedoch als Ersatz für die DI-API von Spring verwendet werden.
quelle
Ich verwende Apache OpenWebBeansals CDI-Implementierung und MyFaces CODI als tragbare Erweiterung für mehrere Projekte. Ich bin sehr zufrieden damit und hatte keine Probleme damit. OpenWebBeans fehlt derzeit ein wenig in Bezug auf die Dokumentation, aber wenn Sie etwas nicht zum Laufen bringen können, ist es ziemlich einfach, die von MyFaces bereitgestellten Maven-Archetypen zu verwenden, um einfache Projekte mit allen erforderlichen Abhängigkeiten zu generieren, oder Sie fragen auf der Mailingliste. Es ist so großartig, wenn Sie nur an Ihrer Anwendung arbeiten und nicht durch böse Fehler blockiert werden. Ich habe auch viele Projekte mit Spring gemacht. Es ist in Ordnung, aber wenn Sie fragen, was ich für das nächste Projekt verwenden würde, lautet die klare Antwort OpenWebBeans und CODI! Ich bevorzuge OpenWebBeans gegenüber Weld, weil OpenWebBeans sehr anpassungsfähig ist. Das ist großartig, weil Sie mehr oder weniger alles anpassen können, was nicht ist. Es wird von der offiziellen CDI-API / SPI abgedeckt und die Laufzeitleistung ist besser. Und nach dem ersten Projekt würde ich CODI nie wieder in Frage stellen, da es sehr stabil ist, regelmäßig veröffentlicht wird und die meisten großartige neue Funktionen mitbringen, die die Produktivität erheblich verbessern. CODI ist meiner Meinung nach der Ort, der am stabilsten ist und von dem die meisten Innovationen im gesamten CDI-Land stammen.
Um Ihre Frage zu beantworten: Für mich hat CDI Spring vollständig ersetzt, aber Sie benötigen tragbare Erweiterungen, die die Lücken füllen. CDI als Standard hatte nie die Absicht, alles zu lösen, und einige Teile wie die Gespräche sind vom Design her defekt. Die gute Nachricht ist, dass Sie großartige Projekte wie MyFaces CODI haben. CODI behebt fast alle diese Probleme.
quelle