Unterschiede zwischen EJB 3.0 und EJB 2.1

Verglichen mit EJB 2.1 vereinfacht EJB 3.0 den Prozess der Erstellung von Enterprise JavaBean-Anwendungen.

Das zugrunde liegende Konzept der EJB 3.0-Spezifikation gründet sich auf ein einfaches altes Java-Objekt-Programmiermodell (POJO), das Java™-Anmerkungen verwendet, um Informationen zu erfassen, die üblicherweise in Implementierungsdeskriptoren enthalten sind. Implementierungsdeskriptoren sind in den meisten Fällen nun optional. Die freie Verwendung von Standardwerten bedeutet auch, dass Sie weniger unterstützenden Code schreiben und pflegen müssen. Dadurch wird der bei der Erstellung und Verwendung von EJB 3.0-Komponenten erforderliche Programmieraufwand wesentlich vereinfacht.

Während EJB 2.1 Unterstützung für Web-Services, Änderungen bei der Implementierung von Session-Beans, Änderungen beim Aufruf von Unternehmensbeans und ein neues XML-Schema als Ersatz für die DTD, die den Implementierungsdeskriptor ejb-jar.xml definierte, beisteuerte, geht EJB 3.0 einen Schritt weiter. Mit EJB 3.0 wurde ein einfacher Entity-Bean-Persistenzmechanismus durch die Java-Persistenz-API eingeführt. Diese Entitäten basieren auf POJO und können außerhalb eines EJB-Containers ausgeführt werden und benötigen keine Schnittstelle und keinen EJB-Code. In ähnlicher Weise benötigen Session-Beans keine EJB-spezifischen Komponentenschnittstellen mehr.

Vergleich der EJB 2.1-Klasse plus Implementierungsdeskriptordatei mit der äquivalenten EJB 3.0-Klasse

Die Beispiele in Tabelle 1 sind funktional äquivalent:

Tabelle 1. Vergleich zwischen EJB 2.1 und EJB 3.0
EJB 2.1 EJB 3.0

Java-Klasse

public class AccountBean
implements javax.ejb.SessionBean {

     SessionContext ctx;
     DataSource accountDB;

     public void setSessionContext(SessionContext ctx) {
        this.ctx = ctx;
     }

     public void ejbCreate() {
          accountDB = (DataSource)ctx.lookup(
                          "jdbc/accountDB");

     }
     public void ejbActivate() { }
     public void ejbPassivate() { }
     public void ejbRemove() { }

     public void setAccountDeposit(int empId,
                                      double deposit) {
       ...
       Connection conn = accountDB.getConnection();
       ...
     }
  ...
}

Java-Klasse

@Stateless
public class AccountBean implements Account
{
     @Resource private DataSource accountDB;

     public void setAccountDeposit(int customerId,
                                      double deposit) {
       ...
       Connection conn = accountDB.getConnection();
       ...
     }
  ...
}

Implementierungsdeskriptor

<session>
  <ejb-name>AccountBean</ejb-name>
  <local-home>AccountHome</local-home>
  <local>Account</local>
  <ejb-class>com.example.AccountBean</ejb-class>
  <session-type>Stateless</session-type>
  <transaction-type>Container</transaction-type>
  <resource-ref>
    <res-ref-name>jdbc/accountDB</res-ref-name>
    <res-ref-type>javax.sql.DataSource</res-ref-type>
    <res-auth>Container</res-auth>
  </resource-ref>
</session>
...
<assembly-descriptor>...</assembly-descriptor>
 
Die folgenden vier Facetten von Java EE 5 haben am meisten zu den Änderungen in EJB 3.0 gegenüber EJB 2.1 beigetragen: