it-swarm.com.de

Soll ich @EJB oder @Inject verwenden?

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?

137
LuckyLuke

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 @EJBs 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

168
Piotr Nowicki

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

30
Bozho

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. 

12
necromancer

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?

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

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

11
John Manko

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

3
ken

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.

0
javierZanetti