EJB 2 und EJB 3 im Container
Jeder EJB 3 Container muss auch EJB 2.x Beans verwalten können. Beim Design der neuen Spezifikation war es wichtig, dass
– eine EJB 2.x Bean in eine EJB 3.0 Bean injiziert werden kann,
– eine EJB 3.0 Bean sich von außen als EJB 2.x Bean ansprechen lässt.
Klassisches Home/Component-Interface
Nehmen wir für eine Session-Bean eine EJBHome-Schnittstelle MyHome an, dessen create()-Methode ein MyRemote liefert.
public interface MyHome extends EJBHome {
public MyRemote create()
throws CreateException, RemoteException;
}
public interface MyRemote extends EJBObject {
public void foo() throws RemoteException;
}
@EJB injiziert eine EJB 2 Bean
Mit der Annotation @EJB injiziert der Container nicht nur EJB 3 Verweise, sondern auch EJB 2 Beans. Da EJB 2 Beans kein Business-Interface haben, injiziert der Container Exemplare, die das Home-Interface implementieren. Der Container soll die Objektvariable myHome belegen:
@EJB private MyHome myHome;
Der Zugriff auf die EJB 2-Bean läuft wie üblich über create():
MyRemote bean = myHome.create();
bean.foo();
@RemoteHome/@LocalHome
Mit den neuen Annotationen aus EJN 3.0 kann eine Enterprise-Bean mit einer EJB 2 Sicht veröffentlicht werden. Dazu ist ein Remote- und Component-Interface nötig.
– Etwa wie im Beispiel MyHome und MyRemote.
Im nächsten Schritt wird die Bean mit @RemoteHome/@LocalHome annotiert, etwa so:
@RemoteHome( MyHome.class )
Nur das Home-Interface, aber nicht das Componten-Interface, kommt in die Annotation.
Die EJB implementiert das Componten-Interface nicht, muss auch keine Annotationen vor diese Methoden setzen. Die create-Methoden werden mit @Init annotiert. Der Name ist egal.
Beispiel einer EJB 2 mit der EJB 3 API
@Stateful
@RemoteHome( MyHome.class )
public class MyEJB2Bean
{
@Init
public void create() { }
public void foo() { }
}