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:
| 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>
|