Ist CDI ein guter Ersatz für Spring?

72

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?

Prassee
quelle

Antworten:

101

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 ...

Jan Groth
quelle
Ich denke, CDI verwendet statische Inyection wie Spring. Laut Schweißdokumentation 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 mich stateful way inyectionbedeutet die Fähigkeit, die Injektion von Bohnen aus verschiedenen Kontexten zu handhaben, es verwendet Proxys, die auf die "richtige" Instanz jeder Bohne verweisen
Victor Martinez
10
Nein, das ist nicht richtig - ich folge nicht Ihrer Definition der dynamischen Injektion. Der dynamische Teil von CDI besteht vielmehr darin, dass Abhängigkeiten (wie beim Schreiben) als Proxy verwendet werden und dass der Proxy darauf achtet, die richtige Abhängigkeit aufzulösen, wenn dies angefordert wird (sodass zwei Aufrufe einer Abhängigkeit an zwei verschiedene Instanzen dieser Abhängigkeit weitergeleitet werden können). Aber vielleicht ist ein Kommentar nicht der richtige Ort, um eine Diskussion zu beginnen. Vielleicht möchten Sie eine neue Frage dafür eröffnen ...
Jan Groth
1
Ist das jetzt noch so?
Sero
4
Spring's approach is static. Ich denke nicht, dass dies (zumindest derzeit) völlig korrekt ist. Spring bietet auch andere Bereiche (z. B. den prototypeBereich), mit denen Beans und Drähte zur Laufzeit während der Ausführung der Anforderung aufgelöst werden.
Dimos
12

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.

βξhrαng
quelle
6
Ich denke, CDI kümmert sich um die AOP über Interceptors
Prassee
1
Interceptors sind AOP im Allgemeinen sehr ähnlich, verfügen jedoch nicht über die Funktionen, die ein AOP-Framework oder eine Sprache wie AspectJ bietet.
βξhrαng
4
Sie können Erweiterungen schreiben, die Beans basierend auf Ihren Regeln Interceptors hinzufügen. Das ist sehr einfach. Für die meisten Anwendungen sind umfangreiche Anwendungen von AOP zu komplex, um nützlich zu sein.
Dar Whi
Alles, was über AOP erreicht werden kann, kann mit CDI Interceptors erreicht werden. Bitte denken Sie daran, keine religiösen Antworten zu schreiben.
4

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.

Dar Whi
quelle