T9B - Ejb3
T9B - Ejb3
T9B - Ejb3
Aplicaciones Distribuidas
Contenido
• Introducción
• Motivación
• Características básicas
• Inyección de dependencia
• Tipos de EJB 3
• Conclusiones
2
Introducción
3
• En la especificación 3.0, los EJB no son más que
POJOs con servicios implicitos, que se activan
en runtime cuando son ejecutados en un contenedor
de EJBs.
4
• Los servicios que debe proveer el contenedor de EJBs deben ser
especificados por el programador a través de metadatos:
• Anotaciones de Java5 intercaladas en el código de las clases.
• Descriptores XML (archivos XML separados).
5
• Existen tres tipos de EJBs:
6
Motivación
7
Características básicas
• No necesario el uso de descriptores XML (uso de metadatos)
• Anotaciones como tipo de programación orientado a atributos
(similar a XDoclet).
import javax.ejb.*;
@Stateless
public class MyAccountBean implements MyAccount
{
@Tx(TxType.REQUIRED)
@MethodPermission({"customer"})
public void deposit(double money) {...}
}
9
@Entity
}
10
Servicios integrados en
EJB 3
• Integración: Proveen una forma de acoplar en tiempo de
ejecución diferentes componentes (se puede hacer
mediante Inyección de Dependencia o usando JNDI)
12
• Web Services: Un Stateless Session Bean puede publicar sus
métodos como web services mediante una sencilla anotación
13
Ejemplo ‘Hola Mundo’
package ejb3inaction.example;
public interface HelloUser {
public void sayHello(String name);
package ejb3inaction.example;
import javax.ejb.Stateless;
@Stateless
public class HelloUserBean implement HelloUser {
}
14
Inyección de dependencia
• La Inyección de Dependencia (ID) es un concepto (o patrón)
de arquitectura que se especializa en inyectar objetos en una
clase, en lugar de ser la propia clase quien cree el objeto
15
• La inyeccion de dependecias sirve para desacoplar
completamente una interface de su implementación
• En el ejemplo, gracias al polimorfismo podemos usar la
interface HelloUser sin conocer HelloUserBean y además
evitamos new HelloUserBean()
16
• La inyección de dependencias para el uso de entidades
requiere @PresistenceContext:
@Stateless
public class PlaceBidBean implements PlaceBid {
@PersistenceContext(unitName="actionBazaar")
private EntityManager entityManager;
...
private Bid save(Bid bid) {
entityManager.persist(bid);
return bid;
}
}
17
• Inyección de recursos
@Resource(name=”jdbc/ActionBazaarDS”)
@Resource(name=”jdbc/ActionBazaarDB”)
this.dataSource = dataSource;
}
18
• ejb-jar.xml
<resource-ref>
<res-ref-name>jdbc/ActionBazaarDS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
<injection-target>
<injection-target-class>
actionbazaar.buslogic.BidManagerBean</injection-target-class>
<injection-target-name>dataSource</injection-target-name>
</injection-target>
</resource-ref>
19
• Inyección de dependencias de EJB de Sesión
@EJB(name=”BidManagerRemote”)
private BidManager bidManager;
• ejb-jar.xml
<ejb-ref>
<ejb-ref-name> BidManagerRemote</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<remote>example. BidManagerRemote</remote>
</ejb-ref>
20
Tipos de EJB 3
Tipos: Beans de Sesion (con/sin estado), de Entidad y MDB
21
• Interface
• Aunque son requeridas, no es necesario definirlas, ya que el contenedor es
capaz de generarlas
• Puede ser definida como local (por defecto) o global
• En una interfaz generada automáticamente se agregan todos los métodos
de la clase bean que han sido definidos públicos.
@Stateless
@Local ({Trader.class})
@Remote ({RemoteTrader.class})
public class TraderBean implements Trader, RemoteTrader
{
public void buy (String symbol, int quantity){
System.out.println("Buying "+quantity+ " of "+ symbol); }
public void sell (String symbol, int quantity);{
System.out.println("Selling "+quantity+ " of "+ symbol); }
}
22
• Statefull Session Beans
• Clase Bean
• Mediante la anotación @Stateful
• Cada stateful session bean necesita implementar la interfaz
serializable, para que de esta manera el contenedor pueda
serializar las instancias del bean y almacenarlas para preservar el
estado cuando las instancias no son usadas.
@Stateful
public class TraderBean implements Trader, Serializable
{
…
}
23
• Entity Beans
• La anotación asociada a este tipo de EJB es el @Entity y
todas sus propiedades y campos en la clase entity bean no
marcadas con la anotación @Transient son consideradas
persistentes
@Entity
public class Customer implements Serializable {
private Long id;
private String name;
@Id
public Long getId() { return id; }
…
24
Conclusiones
• EJB 3 es una especificación abierta de Sun Microsystem.
• Para utilizar EJB 3 se requiere un contenedor de EJB 3 que
implemente la especificación (Glassfish, JBoss…).
• El uso de EJBs en una aplicación nos abstrae de muchos
servicios transversales como: integración, pooling, mensajería,
transacciones, seguridad, dependencias, etc.