Forskelle mellem EJB 3.0 og EJB 2.1

I forhold til EJB 2.1 forenkler EJB 3.0 den måde, Enterprise JavaBean-programmer udvikles på.

Det underliggende princip for EJB 3.0-specifikationen er baseret på POJO-programmeringsmodellen (Plain Old Java™ Object), der bruger Java-annotationer til at samle oplysninger, som tidligere var indeholdt i distributionsdeskriptorer. Distributionsdeskriptorer er nu valgfri i de fleste tilfælde. Udbredt brug af standardværdier betyder også, at der skal skrives og vedligeholdes mindre støttekode. Det gør programmeringen langt enklere ved oprettelse og brug af EJB 3.0-komponenter.

Hvor EJB 2.1 tilføjede understøttelse af webserviceprogrammer, ændring af implementeringen af sessions-beans, ændring af den måde, Enterprise-beans startes på, og et nyt XML-skema, der erstattede den DTD, som definerede ejb-jar.xml-distributionsdeskriptoren, går EJB 3.0 et skridt videre. EJB 3.0 indfører en simpel mekanisme til persistens for entitets-beans via Java Persistence-API'et. Disse entiteter er POJO-baserede (Plain Old Java Object) og kan udføres uden for et EJB-opbevaringssted, og de skal ikke indeholde grænseflader eller EJB-kode. På tilsvarende vis behøver sessions-beans ikke længere EJB-specifikke komponentgrænseflader.

Sammenligning af EJB 2.1-klasse plus distributionsdeskriptorfil med tilsvarende EJB 3.0-klasse

Eksemplerne i tabel 1 svarer funktionsmæssigt til hinanden:

Tabel 1. Sammenligning af EJB 2.1 og 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();
       ...
     }
  ...
}

Distributionsdeskriptor

<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>
 
Følgende fire facetter i Java EE 5 har bidraget mest til ændringerne i EJB 3.0 i forhold til EJB 2.1: