Post on 02-Apr-2015
EJB 3.0
Tutor: Ing. Juan E. Talavera Horn
2010
Definición
La especificación EJB es una de las varias APIs definidas en la Plataforma Java Enterprise Edition.
Provee una manera estándar de implementar código de negocios que típicamente se encuentran en las aplicaciones empresariales
Historia
Fue inicialmente desarrollada por IBM en 1997 y luego adoptada por Sun Mycrosystems (EJB 1.0 y EJB 1.1) 98/99
En sep/2001 se lanza EJB 2.0 En nov/2003 se lanza EJB 2.1 En may/2006 se lanza EJB 3.0
Tipos EJB
Session BeansStateless Session BeansStateful Session Beans
Entity BeansContainer Managed PersistanceBean Managed Persistance
Message Driven Beans
Servicios del Contenedor
Comunicación remota Transacciones Control de concurrencia Eventos utilizando JMS Servicios JNDI Seguridad
Arquitectura
Cliente Desktop
AplicaciónWeb
Web Service
AplicaciónWeb
Servidor de aplicaciones
Web Service
SessionBeans
Webserviceclient
WebBrowser
HTTP
SOAP-WSDL HTTP
RMI
RMI
RMI
Local Method Invocation
SQL
J2EE 1.4 Application Components
Problemas con EJB 2.x
InconvenientesRequiere implementar varias interfaces y
varios métodos innecesariosLas interfaces requieren la implementación de
EJBObject o EJBLocalObject e implementar varias excepciones innecesarias
El deployment descriptor es complejo y propenso a errores
La persistencia es compleja de desarrollar y administrar
Problemas con EJB 2.x
InconvenientesLos componentes EJB no son orientados a
objetos (no admite herencia)No es posible probar los componentes EJB
fuera del contenedor EJB, y hacer debugging dentro del contenedor es extremadamente impráctio
Encontrar e invocar un EJB es una tarea complicada. (JNDI)
J5EE – Breve Presentación
Es la siguiente evolución de J2EE 1.4 Implementa los estándares más
actualizados en el mercado Es construido sobre la API J2SE 1.5 Incluye a la especificación EJB 3.0
Especificación EJB 3.0
ObjetivoCaracterísticas nuevasDefiniciónEjemplosConclusión
Objetivo
El objetivo de EJB 3.0 es simplificar el desarrollo de las aplicaciones Java y estandarizar la API de persistencia
Características nuevas
Elimina la necesidad de implementar interfaces y métodos innecesarios
Utiliza metadata annotations en vez del descriptor de despliegue
Los EJBs son clases Java normales (POJO) así como las interfaces
Qué es un EJB?
Es un componente JEE reusable y portable
Consisten en métodos que encapsulan la lógica de negocios
Puede ser invocado por una variedad de componentes internos y externos al JVM
Son desarrollados como POJOs y los metadata annotations definen cómo estos beans deben ser tratados.
Entity EJB
@Entity@Table(name = "EMPLOYEES")public class Employee implements java.io.Serializable { @Id @Column(name="EMPNO", primaryKey=true) private int empId;
private String eName; private double sal;
<...getters y setters>
}
Stateless Session EJBs
import javax.ejb.Stateless;
@Stateless(name="CalculateEJB")public class CalculateEJBBean implements CalculateEJB{
int value = 0;
public String incrementValue() {value++; return "value incremented by 1";
}}
Stateless Session EJBs (interfaz)
import javax.ejb.Local;
@Localpublic interface CalculateEJB{
public String incrementValue();}
Cliente
import javax.naming.Context;import javax.naming.InitialContext;
public class CalculateejbClient {
public static void main(String [] args){ Context context = new InitialContext(); CalculateEJB myejb =
(CalculateEJB)context.lookup("java:comp/env/ejb/CalculateEJB");
System.out.println ( myejb.incrementValue() ); }}
Cliente (DI)
public class CalculateejbClient {
@EJB CalculateEJB myejb;
public static void main(String [] args){
System.out.println ( myejb.incrementValue() ); }}
Dependency Injection (DI)
Reglas para DI
Solo desde clases cuyo ciclo de vida es administrado por el contenedor, como servlets, JSF backing bean, implementaciones de tags jsp, filters y listeners.
Se inyectan las referencias a las variables al instanciar la clase.
Stateful Session EJBs
Stateful Session EJBs
Stateful Session Bean Client
Session Beans
Una clase que implementa los métodos, anotada con @Stateless o @Stateful
Una o mas interfaces, anotadas con @Local, @Remote o @WebService
Múltiples Interfaces
Reglas para Session Beans Un session bean debe tener al menos una
interfaz La clase debe ser concreta. Implementa todos
los métodos definidos en las interfaces Debe tener un constructor sin argumentos Puede heredar otro session bean o cualquier
POJO Los métodos de negocio o life-cycle-callbacks
pueden definirse en la super clase Los métodos de negocio no deben comenzar
con “ejb”
Lifecycle callbacks
Pool de Stateless Session Beans
Ciclo de vida de Stateless EJBs
Crear instancias del bean con el constructor por defecto
Inyectar recursos al bean Poner las instancias en un pool Cuando un cliente invoca un método, sacar del
pool una instancia Ejecutar el método solicitado por el cliente Cuando termina la ejecución del método,
retornar la instancia al pool Cuando se requiera, eliminar algunas instancias
Sateful session beans
El contenedor se asegura que invocaciones sucesivas al mismo bean se hagansobre la misma instancia para un cliente dado.
Consideraciones para Stateful Beans Las variables de instancia deben ser tipos
primitivos o deben implementar la interfaz serializable.
Debe marcarse algún método con el annotation @Remove
Además de los callbacks PostConstruct y PreDestroy, se invocan a PrePassivate y PostActivate
Consideraciones para Stateful Beans No debe inyectarse un stateful bean en un
objeto sin estado como un stateless session bean, o un servlet.
Puede inyectarse un stateful bean en otro stateful bean.
Puede inyectarse un stateless bean en un stateful bean
Cuando no pueda inyectarse, debe usarse JNDI
Principales diferencias
Persistencia
Session Bean EntityManagerEntityBean SQL
insert intoalumno (…) values) (...)
EntityBean
EntityManager
Stateful Bean desde Servlet
InitialContext ctx = new InitialContext();InscripcionesFacadeLocal inscFacade = (InscripcionesFacadeLocal)ctx.lookup("InscripcionesFacade/local");inscFacade.setAlumno(alumno);
request.getSession().setAttribute("beanInscFacade", inscFacade);
-----------------------------------------------------------
InscripcionesFacadeLocal inscFacade = (InscripcionesFacadeLocal)request.getSession().getAttribute("beanInscFacade");
inscFacade.removeMateria(materia.getCodigoMateria());