Ich habe diese Frage gefunden: Was ist der Unterschied zwischen @Inject und @EJB , aber ich bin nicht klüger geworden. Ich habe Java EE noch nicht gemacht und habe keine Erfahrung mit der Abhängigkeitsinjektion, daher verstehe ich nicht, was ich verwenden soll.
Ist @EJB und alte Art zu spritzen? Wird die Injektion durch den EJB-Container durchgeführt, wenn diese Anmerkung 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?
Der @EJB
wird nur für das Injizieren von EJBs verwendet und ist seit einiger Zeit verfügbar. @Inject
kann jedes verwaltete Bean injizieren und ist Teil der neuen CDI-Spezifikation (seit Java EE 6).
In einfachen Fällen können Sie @EJB
einfach in @Inject
ändern. In fortgeschrittenen Fällen (z. B. wenn Sie stark von @EJB
s Attributen wie beanName
, lookup
oder beanInterface
abhängig sind), müssen Sie ein @Inject
-Feld oder eine __-Methode definieren, um @Producer
zu verwenden.
Diese Ressourcen können hilfreich sein, um die Unterschiede zwischen @EJB
und @Produces
zu verstehen und herauszufinden, wie Sie diese optimal nutzen können:
Antonio Goncalves 'Blog:
CDI Teil I
CDI Teil II
CDI Teil III
JBoss Weld-Dokumentation:
CDI und das Java EE-Ökosystem
Paketüberfluss:
Inject @EJB Bean basierend auf Bedingungen
@Inject
kann ein beliebiges Bean injizieren, während @EJB
nur EJBs injizieren kann. Sie können entweder EJBs einfügen, aber ich würde @Inject
überall bevorzugen.
Update: Diese Antwort ist möglicherweise falsch oder veraltet. Bitte sehen Sie Kommentare für Details.
Ich habe von @Inject
zu @EJB
gewechselt, weil @EJB
eine zirkuläre Injektion erlaubt, während @Inject
darauf kotzt.
Details: Ich brauchte @PostConstruct
, um eine @Asynchronous
-Methode aufzurufen, dies würde jedoch synchron erfolgen. Die einzige Möglichkeit, den asynchronen Aufruf durchzuführen, bestand darin, dass das Original eine Methode einer anderen Bean aufgerufen hat und die Methode der Original-Bean zurückgerufen wurde. Dafür brauchte jede Bohne einen Bezug auf die andere - also kreisförmig. @Inject
ist für diese Aufgabe fehlgeschlagen, während @EJB
funktioniert hat.
Hier ist eine gute Diskussion zum Thema. Gavin King empfiehlt @Inject über @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
Betreff: Injizieren mit @EJB oder @Inject?
- November 2009, 20:48 Uhr Amerika/New_York | Link Gavin King
Dieser Fehler ist sehr merkwürdig, da lokale EJB-Referenzen immer .__ sein sollten. serialisierbar sein. Fehler in Glasfischen vielleicht?
Grundsätzlich ist @Inject immer besser, da:
it is more typesafe, it supports @Alternatives, and it is aware of the scope of the injected object.
Ich empfehle die Verwendung von @EJB, mit Ausnahme der Angabe von Verweisen auf Remote-EJBs.
und
Betreff: Injizieren mit @EJB oder @Inject?
November 2009, 17:42 Uhr Amerika/New_York | Link Gavin King
Bedeutet es @EJB besser mit Remote-EJBs?
Für eine Remote-EJB können keine Metadaten wie Qualifikationsmerkmale .__ deklariert werden. @Alternative usw. in der Bean-Klasse, da der Client einfach nicht .__ ist. Zugriff auf diese Metadaten haben. Außerdem einige zusätzliche Es müssen Metadaten angegeben werden, die wir für den lokalen Fall nicht benötigen. (globaler JNDI-Name von was auch immer). Das ganze Zeug muss also gehen woanders: nämlich die @Produces-Deklaration.
Wenn Sie @EJB und @Inject ..__ verwenden, kann es auch hilfreich sein, den Unterschied in Bezug auf die Sitzungs-Bean-Identität zu verstehen. Gemäß den Spezifikationen wird der folgende Code immer true
sein:
@EJB Cart cart1;
@EJB Cart cart2;
… if (cart1.equals(cart2)) { // this test must return true ...}
Bei Verwendung von @Inject anstelle von @EJB gibt es nicht dasselbe.
siehe auch Stateless Session Beans Identität für weitere Informationen
In Java EE 5 gab es bereits Injektionen, beispielsweise mit den Annotationen @Resource, @PersistentUnit oder @EJB .. Sie war jedoch auf bestimmte Ressourcen (Datenquelle, EJB ...) und in bestimmte Komponenten (Servlets, EJBs, JSF) beschränkt Rücken Bean..). Mit CDI können Sie dank der @Inject-Annotation nahezu überall etwas injizieren.