Ich habe diese Frage gefunden: Was ist der Unterschied zwischen @Inject und @EJB, aber ich bin nicht klüger geworden. Ich habe noch nie Java EE ausgeführt und habe auch keine Erfahrung mit der Abhängigkeitsinjektion, sodass ich nicht verstehe, was ich verwenden soll.
Ist @EJB eine alte Art zu injizieren? Wird die Injektion vom EJB-Container durchgeführt, wenn diese Annotation verwendet wird, während @Inject das neue CDI-Framework verwendet? Ist das der Unterschied und sollte ich @Inject anstelle von @EJB verwenden, wenn dies der Fall ist?
quelle
@EJB
die zirkuläre Injektion (eine Singleton-Bohne und eine andere Bohne benötigen einen Verweis aufeinander)? (unter Bezugnahme auf meine Antwort unten - ich bin nicht sicher, ob ich das Richtige tue, indem ich zu wechsle@EJB
)@Inject
kann jede Bohne injizieren, während@EJB
nur EJBs injiziert werden können. Sie können entweder EJBs injizieren, aber ich würde es@Inject
überall bevorzugen .quelle
Update: Diese Antwort ist möglicherweise falsch oder veraltet. Einzelheiten entnehmen Sie bitte den Kommentaren.
Ich wechselte von
@Inject
zu,@EJB
weil es@EJB
eine kreisförmige Injektion erlaubt, während@Inject
Kotzen drauf sind.Details: Ich musste
@PostConstruct
eine@Asynchronous
Methode aufrufen , dies geschah jedoch synchron. Die einzige Möglichkeit, den asynchronen Aufruf durchzuführen, bestand darin, dass der ursprüngliche Aufruf eine Methode einer anderen Bean und die Methode der ursprünglichen Bean zurückruft. Dazu brauchte jede Bohne einen Verweis auf die andere - also kreisförmig.@Inject
fehlgeschlagen für diese Aufgabe während@EJB
gearbeitet.quelle
@Inject
diese in den öffentlichen Feldern des jeweils anderen. Wenn das funktioniert, ist meine Antwort falsch. Wenn das nicht funktioniert, ist meine Antwort bisher richtig. Als nächstes ändern Sie das@Inject
zu@EJB
(und kommentieren Sie möglicherweise die Klassen selbst? Ich vergesse.). Dann sollte die zyklische gegenseitige Injektion gut funktionieren. Deshalb habe ich von@Inject
zu gewechselt@EJB
. Hoffe das macht Sinn.Hier ist eine gute Diskussion zum Thema. Gavin King empfiehlt @Inject over @EJB für nicht entfernte EJBs.
http://www.seamframework.org/107780.lace
oder
https://web.archive.org/web/20140812065624/http://www.seamframework.org/107780.lace
und
quelle
Es kann auch nützlich sein, den Unterschied im Begriff der Session Bean-Identität zu verstehen, wenn @EJB und @Inject verwendet werden. Gemäß den Spezifikationen lautet der folgende Code immer
true
:Bei Verwendung von @Inject anstelle von @EJB ist dies nicht dasselbe.
siehe auch stateless Session Beans Identität für weitere Infos
quelle
In Java EE 5 war beispielsweise bereits eine Injektion mit den Annotationen @Resource, @PersistentUnit oder @EJB vorhanden. Es war jedoch auf bestimmte Ressourcen (Datenquelle, EJB ...) und auf bestimmte Komponenten (Servlets, EJBs, JSF-Backing-Bean ...) beschränkt. Mit CDI können Sie dank der Annotation @Inject fast alles überall injizieren.
quelle