Unterschied Instantiierung einer normalen Klasse und einer EJB-Klasse

oraclin25

Erfahrenes Mitglied
Hallo zusammen,

ich lerne gerade Java EE. Angenommen, ich habe so eine einfache EJB:
Code:
import javax.ejb.Stateless;
 
@Stateless
public class HelloWorldBean implements HelloWorld {
    public HelloWorldBean() {
    }
 
    public String sayHello() {
        return "Hello World ******";
    }
}

Mit dem dazu passenden Interface:
Code:
import javax.ejb.Remote;
 
@Remote
public interface HelloWorld {
    public String sayHello();
}

Meine Frage:
Gibt es einen Unterschied, wenn ich in meiner main-Methode folgende Referenzvariablen deklariere bzw. definiere?

Code:
HelloWorldBean var_ohne_annotation;
Code:
@EJB
HelloWorldBean var_mit_annotation;

Oder, darf man überhaupt die erste Variante nehmen?

Vielen lieben Dank.

Viele Grüße aus Rheinland,

Eure Ratna
 

navino

Mitglied
Hallo,

also in einem J2EE Server hat eine main nix zu suchen.
Du hast in beiden Fällen eine Referenz angelegt. Im zweiten Fall wird die Bean mit der Annotation @EJB vom Container injeziert, im 1. Fall nicht.

Gruß
navino
 

oraclin25

Erfahrenes Mitglied
Hallo navino,

vielen Dank für die Antwort. Ich habe soweit verstanden, wie die beiden Varianten unter der Haube "erzeugt" werden. Nur verstehe ich nicht, wann ich welche Variante verwenden soll. Klar ist, dass die Klasse HelloWorldBean eine Bean-Klasse ist. Aber wieso soll ich die Variante mit @EJB bevorzugen als normales

Code:
HelloWorldBean var = new HelloWorldBean();

?

Vielen Dank.

Viele Grüße aus Rheinland,

Eure Ratna
 

navino

Mitglied
Hallo,

also wenn du @EJB benutzt wird das Objekt vom Container gemaneged (erzeugt, geschlossen, usw). Das kannst du aber wieder nur mit anderen Beans machen.
Ich weiß ja jetzt nicht wass du machen willst, angenommen eine JSF-Anwendung die auf einem J2EE-Server läuft. Da hat man in der Regel eine ManagedBean die einen Service injeziert bekommt. Dieser Service bekommt dann ein DAO injeziert, die den Zugriff auf die Datenbank macht.
Hier mal ein Ausschnitt von mir:

@ManagedBean(name="logonBean")
@SessionScoped
public class LogonManagedBean {

@EJB
private UserService userService;
.....

in der LogonBean kann ich dann u.a folgendes machen:
UserDTO user = userService.getUser(principal.getName());

** Ich habe kein new-Operator verwendet, das mcht der Container für mich...

Im Userservice benötige ich dann den Zugriff auf die DB:


@Stateless
public class UserServiceImpl implements UserService {

@EJB
private UserDao userDao;

...
und hier kann dann mit dem userDao auf die DB zugegriffen werden.

Mit anderen Worten: Du injezierst Logik in deine Klasse/Bean die vom Server verwaltet werden.
Ich mache das in der Regel für Beans die die Geschäftslogik beinhalten und für den Zugriff auf die DB.

Erzeugt man einen String, macht man das natürlich nicht ;-)

String s = new String ("immer am Ball bleiben");

Gruß
navino
 

oraclin25

Erfahrenes Mitglied
Hallo navino,

vielen Dank für die rasche Antwort. Ich glaube, ich habe fast verstanden, aber nur fast. Ich möchte mal kleinlich sein:
Bei mit Annotation erzeugtem Objekt bzw. vom Applikationsserver gemanagtem Objekt haben wir einen Vorteil, dass der Applikationsserver einige Transaktionen übernimmt, z.B. das Erzeugen, Löschen und weitere.

Die Erzeugung und die Löschung sind sicherlich der offensichtlichste Vorteil, den man dabei ziehen kann. Nur:
Es existiert aber Garbage Collection unter "normalem" Java. Also, EE vs. SE = 1 zu 1

Die Frage, die bei mir auftaucht ist:
Könnte man in einer Java EE - Anwendung in diesem Fall auf die Annotation verzichten und das Objekt stattdessen lediglich normal erzeugen:
Code:
HelloWorldBean var = new HelloWorldBean();

Ich habe versucht, in Google nach einem klaren Beispiel zu suchen, wo die Verwendung von Annotation @EJB unverzichtbar ist bzw. einen echten Vorteil darstellt. Leider aber bisher noch nicht fündig geworden.:(

Vielen Dank.

Viele Grüße aus Rheinland,

Eure Ratna:)
 

navino

Mitglied
Hallo,

du solltest dich mal mit dem Thema Dependency Injection beschäftigen...
Also was passiert hier:
HelloWorldBean var = new HelloWorldBean();

es wird ein Object vom Typ HelloWorldBean erstellt.

und was passiert hier:

@EJB
private UserService userService;

es wird nur eine Referenz angelegt, UserService ist nur ein Interface. Die eigentliche Implementierung kann ausgetauscht werden, ohne die Klasse zu ändern die diese benutzt.
Ist das nicht schön...!!****
Wieviele Objekte erzeugt werden, hängt ja vom Anwendungsfall und weiteren Annotation ab.
Ich kann ja so eine Bean auch mit @Request annotieren, was bedeutet, das bei jedem neunen Request auch eine neue Instanz erzeugt wird. Wie würdest du das machen.... (wahrscheinlich einen kleinen Server schreiben)
Ich rufe ja auch nicht mehr den Garbage Collecter auf, das macht die VM für mich...
Wie gesagt, für Geschäftslogik, Datenbankzugriff, ManagedBeans bieten sich diese Beans an...

Gruß
navino