Diferenças entre o EJB 3.0 e o EJB 2.1

Comparada à EJB 2.1, a EJB 3.0 simplifica o processo de criação de aplicações Enterprise JavaBean.

O conceito subjacente da especificação de EJB 3.0 centra-se num modelo de programação de objecto Java™ antigo (POJO) que utiliza as anotações Java para capturar informações que os descritores de implementação costumavam conter. Na maior parte dos casos, os descritores de implementação são agora opcionais. O uso liberal de valores predefinidos também significa que precisa de escrever e manter menos código de suporte. Este facto simplifica grandemente a experiência de programação na criação e uso de componentes de EJB 3.0.

Enquanto a EJB 2.1 adicionou suporte para serviços Web, alterações à implementação de beans de sessão, alterações em como os beans empresariais são invocados e um novo esquema de XML para substituir o DTD que definia o descritor de implementações ejb-jar.xml, a EJB 3.0 levou este passo mais além. A EJB 3.0 introduziu um mecanismo de persistência de bean de entidade ligeiro através da API de Persistência de Java. Estas entidades são baseadas em POJO e podem ser executadas no exterior de um contentor de EBJ e não necessitam conter interfaces ou código EJB. De forma semelhante, os beans de sessão também já não necessita de interfaces de componentes específicas a EJB.

Comparação de classe EJB 2.1 com ficheiros de Descritor de Implementação com classe EJB 3.0 equivalente

Os exemplos na Tabela 1 são funcionalmente equivalentes:

Tabela 1. Comparação de EJB 2.1 e EJB 3.0
EJB 2.1 EJB 3.0

Classe Java

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();
       ...
     }
  ...
}

Classe Java

@Stateless
public class AccountBean implements Account
{
     @Resource private DataSource accountDB;
 
     public void setAccountDeposit(int customerId,
                                      double deposit) {
       ...
       Connection conn = accountDB.getConnection();
       ...
     }
  ...
}

Descritor de implementação

<sessão>
  <nome-ejb>AccountBean</nome-ejb>
  <início-local>AccountHome</início-local>
  <local>Account</local>
  <classe-ejb>com.example.AccountBean</classe-ejb>
  <tipo-sessão>Stateless</tipo-sessão>
  <tipo-transacção>Container</tipo-transacção>
  <ref-recurso>
    <nome-ref-rec>jdbc/accountDB</nome-ref-rec>
    <tipo-ref-rec>javax.sql.DataSource</tipo-ref-rec>
    <aut-res>Container</aut-res>
  </ref-recurso>
</sessão>
...
<assembly-descriptor>...</assembly-descriptor>
 
As seguintes quatro facetas de Java EE 5 contribuíram grandemente para as alterações no EJB 3.0 de EJB 2.1: