4 Stimmen

EJB3-Instanziierung

Ich habe eine wahrscheinlich triviale Frage.

Wenn ich die EJB3+-Schnittstelle definiert habe, sagen wir, sie ist so entfernt:

@Remote
public class FooServiceRemote {
   void foo();
}

und eine Implementierung

@Stateless
public class FooService implements FooServiceRemote {
   void foo() { ... }
}

Wie löst der Anwendungsserver standardmäßig die welche Implementierung zu verwenden ist (und über Proxy aufrufen), wenn er nur die @EJB-Annotation für die Dependency Injection wie bei der Schnittstelle kennt:

public class SomeClass {
   @EJB
   private FooServiceRemote fooService;
}

Geschieht dies durch Reflexion (Verkürzung des Namens der Schnittstelle)? Oder er scannt mögliche Implementierungen einer solchen Schnittstelle und wählt eine aus. Oder ? Und was, wenn ich mehrere Implementierungen einer Schnittstelle erstellen möchte, ist es möglich, und wie zu spezifizieren, welche Implementierung instanziiert werden sollte (vielleicht ist es möglich, über einige Argument der Annotation).

Danke:-)

4voto

Anthony Accioly Punkte 20616

In dem seltenen Fall, dass Sie zwei Beans benötigen, die dieselbe Schnittstelle implementieren (keine gute Praxis), können Sie sie benennen und anhand des Namens auswählen, welche Sie haben möchten.

@Stateless(name="FooService1")
public class FooService1 implements FooService { }

@Stateless(name="FooService2")
public class FooService2 implements FooService { }

public class SomeClass {
   @EJB(beanName="FooService1") 
   private FooService fooService;
}

Andere mögliche Ansätze sind die Suche über JNDI oder die mappedName Eigentum. Siehe die Javadoku für die EJB-Anmerkung hier: http://download.oracle.com/javaee/6/api/javax/ejb/EJB.html

1voto

Topera Punkte 11809

Nur eine Korrektur,

@Remote
interface FooServiceRemote {
   void foo();
}

@Stateless
public class FooService implements FooServiceRemote {
   void foo() { ... }
}

Damit weiß der Anwendungsserver, welche Klassen die angegebene Schnittstelle implementieren.

Wenn Sie zwei Klassen haben, müssen Sie angeben, welche Klasse Sie benötigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X