Seit der JEE Version 6 gibt es einige Verwirrung bezüglich der Annotations die man in seinen Klassen verwenden sollte. Einige Annotations sind doppelt vorhanden (@ManagedBean), andere haben einen ähnlichen Einsatzzweck (@Named oder @ManagedBean in JSF, @Inject oder @EJB)
Ich versuche mal dieses Wirrwar etwas aufzulösen.
Ich fange mal mit den Annotations für das Injecten von EJB-Instanzen an: @EJB bzw. @Inject
Beide werden für die Injektion von EJBs in einer JEE-Umgebung verwendet, z.B. werden hierüber Fachklassen in JSF-ManagedBeans oder anderen CDI-Bean vom Container übergeben.
Welche Annotation soll ich aber benutzen für das Injizieren einer EJB Session Bean?
@Inject private ServiceBean serviceBean;
oder
@EJB private ServiceBean serviceBean;
??? Was denn nun?
Im Kontext von CDI sind Session Beans ebenfalls Managed Beans. Deshalb können entsprechend EJB-Instanzen mit @Inject in CDI-Beans oder andere SessionBeans injiziert werden. Die EJB-Spezifikation hatte vor CDI-Zeiten für diesen Zweck eine eigene Annotation definiert: @javax.ejb.EJB
Diese Annotation ist aber eher historisch bedingt und bewirkt das Gleiche wie @Inject, ist aber auf EJBs beschränkt.
In neuen Projekten sollte deshalb nur noch @Inject verwendet werden. Es sein denn man arbeitet in einer Umgebung mit EJBs aber ohne CDI, was aber seit JEE6 ziemlich selten vorkommen dürfte.