105
CDI CDI Context and Dependency Injection Context and Dependency Injection Ing. Jose Diaz Diaz Ing. Jose Diaz Diaz JOEDAYZ JOEDAYZ

CDI para Java EE 7

Embed Size (px)

DESCRIPTION

Presentación a nivel introductoria sobre CDI. Desarrollado en base a los libros de Antonio, Arun Gupta y ejemplos de CDI en https://github.com/javaee-samples.

Citation preview

Page 1: CDI para Java EE 7

CDICDIContext and Dependency InjectionContext and Dependency Injection

Ing. Jose Diaz DiazIng. Jose Diaz DiazJOEDAYZJOEDAYZ

Page 2: CDI para Java EE 7

Acerca deAcerca de

Ing. José Amadeo Martin Díaz DíazIng. José Amadeo Martin Díaz Díaz

CEO JoeDayz.pe & Docente en EPE UPCCEO JoeDayz.pe & Docente en EPE UPC

Formación Formación

BlueStar Energy (2007)BlueStar Energy (2007)

Bristol Myers Squibb (2006)Bristol Myers Squibb (2006)

Trans Solutions Systems (2003 - 2005)Trans Solutions Systems (2003 - 2005)

Telefonica Servicios Internet (2000 - 2002)Telefonica Servicios Internet (2000 - 2002)

Egresado de la Pontificia Universidad Católica del Perú (1994 - 2000)Egresado de la Pontificia Universidad Católica del Perú (1994 - 2000)

@jamdiazdiaz@jamdiazdiaz

Page 3: CDI para Java EE 7

JoeDayz.pe PartnershipJoeDayz.pe Partnership

Page 4: CDI para Java EE 7

IntroducciónIntroducciónLa primera versión de Java EE (J2EE) introdujo el La primera versión de Java EE (J2EE) introdujo el concepto de inversión de control concepto de inversión de control

No fue hasta Java EE 5 y 6 que el API para No fue hasta Java EE 5 y 6 que el API para administración de ciclo de vida e inyección de administración de ciclo de vida e inyección de dependencias estuviese robusta.dependencias estuviese robusta.

Hoy CDI nos da un modelo de programación donde Hoy CDI nos da un modelo de programación donde cada componente Java EE puede ser inyectable, cada componente Java EE puede ser inyectable, interceptable y administrable.interceptable y administrable.

CDI esta construido sobre la base de “pobre CDI esta construido sobre la base de “pobre acoplamiento y fuerte tipado"acoplamiento y fuerte tipado"

Page 5: CDI para Java EE 7

¿Que son los Beans?¿Que son los Beans?

Page 6: CDI para Java EE 7

Entendiendo a los BeansEntendiendo a los Beans

Java SE tiene JavaBeansJava SE tiene JavaBeans

Java EE tiene Enterprise Java BeansJava EE tiene Enterprise Java Beans

Otros: Servlets, SOAP WS, RESTful WS, Otros: Servlets, SOAP WS, RESTful WS, entidadesentidades

Beans ManejadosBeans Manejados

POJOsPOJOs

Page 7: CDI para Java EE 7

Entendiendo a los BeansEntendiendo a los Beans

Los Bean Manejados son objetos administrados Los Bean Manejados son objetos administrados por el contenedor que soportan un conjunto por el contenedor que soportan un conjunto basico de servicios: inyección de recursos, basico de servicios: inyección de recursos, administración de ciclo de vida, e intercepción.administración de ciclo de vida, e intercepción.

Introducidos en Java EE 6Introducidos en Java EE 6

Page 8: CDI para Java EE 7

Entendiendo a los BeansEntendiendo a los Beans

Por ejemplo un EJB puede ser un Bean Por ejemplo un EJB puede ser un Bean Manejado con servicios extraManejado con servicios extra

Un Servlet puede ser un Bean Manejado con Un Servlet puede ser un Bean Manejado con servicios extra (diferentes al del EJB), etc. etc.servicios extra (diferentes al del EJB), etc. etc.

Page 9: CDI para Java EE 7

Entendiendo a los BeansEntendiendo a los Beans

Los Beans son objetos CDI que son Los Beans son objetos CDI que son construidos sobre la base del modelo de Bean construidos sobre la base del modelo de Bean Manejados. Manejados.

Tienen contextos definidos, soporte a inyección Tienen contextos definidos, soporte a inyección de dependencias, intercepción, decoración, de dependencias, intercepción, decoración, son especializados con el uso de qualifiers y son especializados con el uso de qualifiers y pueden ser usados en EL.pueden ser usados en EL.

Page 10: CDI para Java EE 7

Entendiendo a los BeansEntendiendo a los Beans

En resumen, cualquier clase Java que tenga un En resumen, cualquier clase Java que tenga un constructor por defecto y se ejecute en un constructor por defecto y se ejecute en un contenedor es un bean.contenedor es un bean.

De esta forma los JavaBeans y EJBs pueden De esta forma los JavaBeans y EJBs pueden tomar ventaja de los servicios CDItomar ventaja de los servicios CDI

Page 11: CDI para Java EE 7

Inyección de Inyección de DependenciasDependencias

Page 12: CDI para Java EE 7

Dependency Injection Dependency Injection (DI)(DI)

Es un patrón de diseño que desacopla Es un patrón de diseño que desacopla componentes dependientes.componentes dependientes.

Termino concebido por Martin Fowler.Termino concebido por Martin Fowler.

Java EE 5 introdujo inyección para recursos como Java EE 5 introdujo inyección para recursos como EJBs, entity managers, data sources, fabricas JMS, EJBs, entity managers, data sources, fabricas JMS, y destinos al interior de componentes como y destinos al interior de componentes como Servlets, JSF beans y EJBs.Servlets, JSF beans y EJBs.

Así aparecieron @Resource, @PersistenceContext, Así aparecieron @Resource, @PersistenceContext, @PersistenceUnit, @EJB y @WebServiceRef@PersistenceUnit, @EJB y @WebServiceRef

Page 13: CDI para Java EE 7

Dependency Injection Dependency Injection (DI)(DI)

El primer paso tomado en Java EE 5 no fue El primer paso tomado en Java EE 5 no fue suficiente y Java EE 6 creo dos suficiente y Java EE 6 creo dos especificaciones diferentes para potenciar DI en especificaciones diferentes para potenciar DI en la plataforma: Dependency Injection (JSR 350) y la plataforma: Dependency Injection (JSR 350) y Context and Dependency Injection (JSR 299)Context and Dependency Injection (JSR 299)

En Java EE 7 se han juntado las dos En Java EE 7 se han juntado las dos especificacionesespecificaciones

Page 14: CDI para Java EE 7

Ciclo de vida de un Bean Ciclo de vida de un Bean ManejadoManejado

Page 15: CDI para Java EE 7

Scopes y ContextScopes y Context

CDI viene con scopes predefinidos: request, CDI viene con scopes predefinidos: request, session, application y conversationsession, application y conversation

Page 16: CDI para Java EE 7

InterceptionInterception

Similar a la programación orientada a aspectos Similar a la programación orientada a aspectos (AOP)(AOP)

El AOP se logra en la plataforma, a través, de El AOP se logra en la plataforma, a través, de interceptors. Estos son automaticamente interceptors. Estos son automaticamente disparados por el contenedor cuando un disparados por el contenedor cuando un método de un bean manejado es invocado.método de un bean manejado es invocado.

Page 17: CDI para Java EE 7

InterceptionInterception

Page 18: CDI para Java EE 7

Deployment DescriptorDeployment Descriptor

beans.xml y es obligatoriobeans.xml y es obligatorio

Ubicado en META-INF o WEB-INFUbicado en META-INF o WEB-INF

Aquí se configura interceptors, decoradores, Aquí se configura interceptors, decoradores, alternatives, etc. alternatives, etc.

Si tu aplicación contiene diferentes jars y Si tu aplicación contiene diferentes jars y deseas tener CDI para toda la aplicación. Cada deseas tener CDI para toda la aplicación. Cada jar debe tener su propio beans.xmljar debe tener su propio beans.xml

Page 19: CDI para Java EE 7

¿De que trata CDI?¿De que trata CDI?

Page 20: CDI para Java EE 7

ResumenResumen

CDI es importante para otras especificaciones CDI es importante para otras especificaciones como Bean Validation, JAX-RS, EJB, JSF.como Bean Validation, JAX-RS, EJB, JSF.

Pero, CDI 1.1 no sería nada sin otras como: DI Pero, CDI 1.1 no sería nada sin otras como: DI (JSR 330), Managed Bean 1.0 (JSR 342), (JSR 330), Managed Bean 1.0 (JSR 342), Common Annotations 1.2 (JSR 250), Common Annotations 1.2 (JSR 250), Expression Language 3.0 (JSR 341) e Expression Language 3.0 (JSR 341) e Interceptors 1.2 (JSR 318)Interceptors 1.2 (JSR 318)

Page 21: CDI para Java EE 7

HistoriaHistoria

En el 2006 inspirado en Seam, Guice y Spring En el 2006 inspirado en Seam, Guice y Spring Framework, Gavin King (creador de Seam) Framework, Gavin King (creador de Seam) lidero la especificación JSR 299 denominada lidero la especificación JSR 299 denominada Web Beans dirigida para Java EE 6. Web Beans dirigida para Java EE 6.

Web Beans ha sido renombrado a Context and Web Beans ha sido renombrado a Context and Dependency Injection 1.0 construida sobre la Dependency Injection 1.0 construida sobre la base de la nueva JSR 330 : Dependency base de la nueva JSR 330 : Dependency Injection para Java 1.0 (@Inject)Injection para Java 1.0 (@Inject)

Page 22: CDI para Java EE 7

HistoriaHistoria

Dependency Injection aporto las anotaciones: Dependency Injection aporto las anotaciones: @Inject, @Named, @Qualifier, @Scope, @Inject, @Named, @Qualifier, @Scope, @Singleton@Singleton

CDI añadió nuevas características como CDI añadió nuevas características como context management, events, decorators, e context management, events, decorators, e interceptors (JSR 318). Ademas de permitir al interceptors (JSR 318). Ademas de permitir al desarrollador extender la plataforma que era desarrollador extender la plataforma que era imposible hasta entonces. imposible hasta entonces.

Page 23: CDI para Java EE 7

HistoriaHistoria

El objetivo principal de CDI es entonces:El objetivo principal de CDI es entonces:

Dar mas cohesión a la plataformaDar mas cohesión a la plataforma

Unir la capa web y la capa de transaccionesUnir la capa web y la capa de transacciones

Que DI sea el ciudadano de primera claseQue DI sea el ciudadano de primera clase

Poder agregar nuevas extensiones facilmentePoder agregar nuevas extensiones facilmente

En JAVA EE 7, CDI 1.1 es el fundamento para En JAVA EE 7, CDI 1.1 es el fundamento para multiples JSRs y ha recibido muchas mejorasmultiples JSRs y ha recibido muchas mejoras

Page 24: CDI para Java EE 7

¿Que hay de nuevo en ¿Que hay de nuevo en CDI 1.1?CDI 1.1?

No añade nuevas características. Su objetivo es integrar CDI con No añade nuevas características. Su objetivo es integrar CDI con otras especificaciones.otras especificaciones.

La nueva clase CDI provee acceso programático a facilidades de La nueva clase CDI provee acceso programático a facilidades de CDI fuera de un bean manejadoCDI fuera de un bean manejado

Interceptors, decoradores, y alternatives pueden ser prioridades Interceptors, decoradores, y alternatives pueden ser prioridades (@Priority) y ordenados para una aplicación completa(@Priority) y ordenados para una aplicación completa

Cualquier tipo o paquete puede ser ignorado de ser considerado un Cualquier tipo o paquete puede ser ignorado de ser considerado un bean para CDI con @Vetoed en el tipo o paquetebean para CDI con @Vetoed en el tipo o paquete

El @New qualifier es deprecado y se debe en su lugar usar El @New qualifier es deprecado y se debe en su lugar usar @Dependent@Dependent

@WithAnnotations permite una extensión para filtrar por tipos@WithAnnotations permite una extensión para filtrar por tipos

Page 25: CDI para Java EE 7

Principales CDI Principales CDI PackagesPackages

Page 26: CDI para Java EE 7

Implementación de Implementación de ReferenciaReferencia

La implementación de referencia para CDI es La implementación de referencia para CDI es Weld, un proyecto Open Source de JBossWeld, un proyecto Open Source de JBoss

Existen otras como Apache OpenWebBeans o Existen otras como Apache OpenWebBeans o CanDi (Caucho), así como Apache DeltaSpikeCanDi (Caucho), así como Apache DeltaSpike

Page 27: CDI para Java EE 7

Escribiendo un bean CDIEscribiendo un bean CDI

Page 28: CDI para Java EE 7

Anatomía de un CDI Anatomía de un CDI BeanBean

No es una clase non-static innerNo es una clase non-static inner

Es una clase concreta o anotada con Es una clase concreta o anotada con @Decorator y@Decorator y

Tiene un constructor por defecto sin Tiene un constructor por defecto sin parámetros, o declara un constructor anotado parámetros, o declara un constructor anotado con @Injectcon @Inject

Todo lo demás es opcionalTodo lo demás es opcional

Page 29: CDI para Java EE 7

Dependency InjectionDependency Injection

Page 30: CDI para Java EE 7

Dependency InjectionDependency Injection

Page 31: CDI para Java EE 7

@Inject@Inject

Nota en Java EE 7 aún se puede usar Nota en Java EE 7 aún se puede usar @Resource, pero, deberías considerar usar @Resource, pero, deberías considerar usar @Inject@Inject

Page 32: CDI para Java EE 7

@Inject@Inject

Page 33: CDI para Java EE 7

Puntos de InyecciónPuntos de Inyección

El punto de inyección puede ser en propiedad, El punto de inyección puede ser en propiedad, setter o constructorsetter o constructor

No es necesario crear un getter/setter para un No es necesario crear un getter/setter para un atributo para usar inyección. No importa si es atributo para usar inyección. No importa si es privado.privado.

En el caso de un constructor solo puedes tener En el caso de un constructor solo puedes tener uno solo con @Injectuno solo con @Inject

Page 34: CDI para Java EE 7

Puntos de InyecciónPuntos de Inyección

¿Cuándo deberías usar inyección por setter o ¿Cuándo deberías usar inyección por setter o constructor?constructor?

No hay respuesta técnica real para esta No hay respuesta técnica real para esta pregunta; depende de tu elección. Recuerda pregunta; depende de tu elección. Recuerda que el contenedor es quien hace el trabajo.que el contenedor es quien hace el trabajo.

Page 35: CDI para Java EE 7

Default InjectionDefault Injection

Si en los ejemplos anteriores asumimos que Si en los ejemplos anteriores asumimos que GeneradorNumero solo tiene una GeneradorNumero solo tiene una implementación (IsbnGenerador). CDI puede implementación (IsbnGenerador). CDI puede inyectarlo sin problemas usando @Injectinyectarlo sin problemas usando @Inject

Cuando no declaras un Qualifier, el contenedor Cuando no declaras un Qualifier, el contenedor asume el qualifier asume el qualifier @[email protected].

Page 36: CDI para Java EE 7

Default InjectionDefault Injection

Page 37: CDI para Java EE 7

Default InjectionDefault Injection

Page 38: CDI para Java EE 7

QualifiersQualifiers

Cuando tenemos que escoger una Cuando tenemos que escoger una implementación especifica entonces usamos implementación especifica entonces usamos QualifiersQualifiers

Page 39: CDI para Java EE 7

QualifiersQualifiers

Page 40: CDI para Java EE 7

QualifiersQualifiers

Page 41: CDI para Java EE 7

QualifiersQualifiers

Page 42: CDI para Java EE 7

QualifiersQualifiers

Page 43: CDI para Java EE 7

Qualifiers con MiembrosQualifiers con Miembros

Que pasa si queremos tener qualifiers Que pasa si queremos tener qualifiers combinados. combinados.

Es decir @DosDigitos, @OchoDigitos, Es decir @DosDigitos, @OchoDigitos, @DiezDigitos, @TreceDigitos@DiezDigitos, @TreceDigitos

O @DosParDigitos, @OchoImparDigitos, O @DosParDigitos, @OchoImparDigitos, @OchoParDigitos, etc.@OchoParDigitos, etc.

Page 44: CDI para Java EE 7

Qualifiers con MiembrosQualifiers con Miembros

En ese caso podemos crear un solo qualifier En ese caso podemos crear un solo qualifier @NumeroDeDigitos con una enumeration como @NumeroDeDigitos con una enumeration como valor y un Boolean para la paridad.valor y un Boolean para la paridad.

Page 45: CDI para Java EE 7

Qualifiers con MiembrosQualifiers con Miembros

Page 46: CDI para Java EE 7

Qualifiers con MiembrosQualifiers con Miembros

Page 47: CDI para Java EE 7

Multiples QualifiersMultiples Qualifiers

Page 48: CDI para Java EE 7

AlternativesAlternatives

Algunas veces tu deseas inyectar una Algunas veces tu deseas inyectar una implementación según el escenario de implementación según el escenario de deployment. deployment.

Digamos que en el ejemplo que estamos Digamos que en el ejemplo que estamos revisando, deseamos generar un numero falso revisando, deseamos generar un numero falso (mock) en un ambiente de pruebas.(mock) en un ambiente de pruebas.

Page 49: CDI para Java EE 7

AlternativesAlternatives

Page 50: CDI para Java EE 7

AlternativesAlternatives

Si queremos que el alternativo Si queremos que el alternativo funcionefuncione

tenemos que habilitarlo en tenemos que habilitarlo en beans.xmlbeans.xml

Page 51: CDI para Java EE 7

ProducersProducers

Hemos visto hasta ahora como un bean CDI se Hemos visto hasta ahora como un bean CDI se inyecta en otro bean CDI.inyecta en otro bean CDI.

Pero, también podemos inyectar primitivos Pero, también podemos inyectar primitivos (long, float, …), tipos de array, o cualquier otro (long, float, …), tipos de array, o cualquier otro POJO que no tiene CDI habilitado. Esto gracias POJO que no tiene CDI habilitado. Esto gracias a los producers.a los producers.

Page 52: CDI para Java EE 7

ProducersProducersPor defecto, no podemos inyectar clases de Por defecto, no podemos inyectar clases de java.util.Date, java.lang.String. Esto debido a que java.util.Date, java.lang.String. Esto debido a que estas clases están en rt.jar y este jar no tiene un estas clases están en rt.jar y este jar no tiene un beans.xmlbeans.xml

Recordemos que si un archivo .jar no tiene Recordemos que si un archivo .jar no tiene beans.xml bajo un META-INF, CDI no podrá beans.xml bajo un META-INF, CDI no podrá descubrir nada y el POJO no podrá tratarse como descubrir nada y el POJO no podrá tratarse como un bean. Es decir, no podrá ser inyectable.un bean. Es decir, no podrá ser inyectable.

La única forma de hacerlo inyectable es usando La única forma de hacerlo inyectable es usando campos producers o métodos producers.campos producers o métodos producers.

Page 53: CDI para Java EE 7

ProducersProducers

Page 54: CDI para Java EE 7

ProducersProducers

Page 55: CDI para Java EE 7

InjectionPoint APIInjectionPoint API

Los atributos y tipos de retorno producidos por Los atributos y tipos de retorno producidos por @Produces no necesitan información alguna de @Produces no necesitan información alguna de donde ellos serán inyectadosdonde ellos serán inyectados

Pero hay otros casos en que si se necesita Pero hay otros casos en que si se necesita saber.saber.

Este último es el caso de Este último es el caso de java.util.logging.Logger. java.util.logging.Logger.

Page 56: CDI para Java EE 7

InjectionPoint APIInjectionPoint API

Page 57: CDI para Java EE 7

ProducerProducer

Page 58: CDI para Java EE 7

DisposersDisposersHemos usado producers para crear tipos o Hemos usado producers para crear tipos o POJOs para que sean inyectados. Pero, no POJOs para que sean inyectados. Pero, no hemos tenido que destruirlos o cerrarlos una hemos tenido que destruirlos o cerrarlos una vez usados.vez usados.

Algunos métodos producers necesitan objetos Algunos métodos producers necesitan objetos que requieren explicitamente destrucción como que requieren explicitamente destrucción como JDBC connections, JMS session, o entity JDBC connections, JMS session, o entity manager.manager.

Para destrucción existen los disposers.Para destrucción existen los disposers.

Page 59: CDI para Java EE 7

DisposersDisposers

Page 60: CDI para Java EE 7

DisposersDisposers

Gracias a los producers y disposers, ya no Gracias a los producers y disposers, ya no tenemos tenemos que crear y cerrar recursosque crear y cerrar recursos

Page 61: CDI para Java EE 7

ScopesScopes

@ApplicationScoped@ApplicationScoped

@SessionScoped@SessionScoped

@RequestScoped@RequestScoped

@ConversationScoped@ConversationScoped

@Dependent (ciclo de vida que depende del @Dependent (ciclo de vida que depende del cliente)cliente)

Page 62: CDI para Java EE 7

ScopesScopes

Los beans con scope @SessionScoped o Los beans con scope @SessionScoped o @ConversationScoped deben ser serializables, @ConversationScoped deben ser serializables, puesto que el contenedor los pone en pausa puesto que el contenedor los pone en pausa de rato en rato.de rato en rato.

Si un scope no es dado. El default es Si un scope no es dado. El default es @Dependent@Dependent

Page 63: CDI para Java EE 7

ConversationConversation

Este scope guarda información del estado del Este scope guarda información del estado del usuario, permanece entre multiples requests y usuario, permanece entre multiples requests y es demarcado programáticamente por la es demarcado programáticamente por la aplicación.aplicación.

Ejemplos de uso: reservas, compras en una Ejemplos de uso: reservas, compras en una tienda virtual, wizard en generaltienda virtual, wizard en general

Page 64: CDI para Java EE 7

ConversationConversation

Page 65: CDI para Java EE 7

ConversationConversation

Page 66: CDI para Java EE 7

Beans en Expression Beans en Expression LanguageLanguage

Por defecto los beans CDI no tienen un nombre Por defecto los beans CDI no tienen un nombre y no son resuelto vía EL binding. y no son resuelto vía EL binding.

Para asignarle un nombre se tiene que usar Para asignarle un nombre se tiene que usar @Named@Named

Page 67: CDI para Java EE 7

Beans en Expression Beans en Expression LanguageLanguage

Page 68: CDI para Java EE 7

InterceptorsInterceptors

Los interceptors son de 4 tipos: Los interceptors son de 4 tipos:

@AroundConstruct: Asociado con el @AroundConstruct: Asociado con el constructor de la clase destinoconstructor de la clase destino

@AroundInvoke: Asociado con un metodo de @AroundInvoke: Asociado con un metodo de negocio especificonegocio especifico

@AroundTimeout: Solo para EJB timer service@AroundTimeout: Solo para EJB timer service

@PostConstruct y @PreDestroy@PostConstruct y @PreDestroy

Page 69: CDI para Java EE 7

InterceptorsInterceptors

Desde JAVA EE 6, los interceptors han Desde JAVA EE 6, los interceptors han evolucionado a una especificación separada. evolucionado a una especificación separada.

Ellos pueden ser aplicados a Bean Manejados, Ellos pueden ser aplicados a Bean Manejados, así como a EJBs, SOAP y RESTful web services.así como a EJBs, SOAP y RESTful web services.

Page 70: CDI para Java EE 7

Interceptor en la misma Interceptor en la misma claseclase

Page 71: CDI para Java EE 7

Respecto al ejemplo anterior. Solo se intercepta Respecto al ejemplo anterior. Solo se intercepta métodos que sean públicos, privados, métodos que sean públicos, privados, protected o default; pero, no static o finalprotected o default; pero, no static o final

El método interceptor debe tener un El método interceptor debe tener un InvocationContext como parámetro y debe InvocationContext como parámetro y debe retornar Objectretornar Object

El método puede arrojar excepciones El método puede arrojar excepciones chequeadaschequeadas

Interceptor en la misma Interceptor en la misma claseclase

Page 72: CDI para Java EE 7

Respecto al ejemplo anterior. Solo se intercepta Respecto al ejemplo anterior. Solo se intercepta métodos que sean públicos, privados, métodos que sean públicos, privados, protected o default; pero, no static o finalprotected o default; pero, no static o final

El método interceptor debe tener un El método interceptor debe tener un InvocationContext como parámetro y debe InvocationContext como parámetro y debe retornar Objectretornar Object

El método puede arrojar excepciones El método puede arrojar excepciones chequeadaschequeadas

Interceptor en la misma Interceptor en la misma claseclase

Page 73: CDI para Java EE 7

InvocationContext InvocationContext InterfaceInterface

Page 74: CDI para Java EE 7

InvocationContext InvocationContext InterfaceInterface

Page 75: CDI para Java EE 7

En el ejemplo anterior se ha usado En el ejemplo anterior se ha usado @Transactional. Este se usa para el manejo de @Transactional. Este se usa para el manejo de transacciones en CDI beans como Servlets, transacciones en CDI beans como Servlets, JAX-RS, JAX-WS. JAX-RS, JAX-WS.

@Transactional es implementado via un @Transactional es implementado via un interceptorinterceptor

Interceptor en la misma Interceptor en la misma claseclase

Page 76: CDI para Java EE 7

Clases Interceptor Clases Interceptor

Esta opción es cuando se desea que el Esta opción es cuando se desea que el comportamiento cross-cutting concerns se comportamiento cross-cutting concerns se debe tener en una clase separada.debe tener en una clase separada.

Un ejemplo de esto es el LoggingUn ejemplo de esto es el Logging

Page 77: CDI para Java EE 7

Clases InterceptorClases Interceptor

Page 78: CDI para Java EE 7

Clases InterceptorClases Interceptor

Page 79: CDI para Java EE 7

Clases Interceptor Clases Interceptor

Si se desea que diferentes métodos sean Si se desea que diferentes métodos sean interceptados de una clase, se puede colocar la interceptados de una clase, se puede colocar la referencia al interceptor en la parte superior de referencia al interceptor en la parte superior de la clase.la clase.

Y si se desa excluir algún metodo se usara Y si se desa excluir algún metodo se usara @ExcludeClassInterceptors@ExcludeClassInterceptors

Page 80: CDI para Java EE 7

Interceptors de ciclo de Interceptors de ciclo de vidavida

Page 81: CDI para Java EE 7

Interceptors de ciclo de Interceptors de ciclo de vidavida

Page 82: CDI para Java EE 7

Encadenando y Encadenando y Excluyendo InterceptorsExcluyendo Interceptors

Page 83: CDI para Java EE 7

Interceptor BindingInterceptor Binding

Interceptor Binding es solo permitido si CDI es Interceptor Binding es solo permitido si CDI es habilitadohabilitado

Un Interceptor Binding es una anotación Un Interceptor Binding es una anotación definida por el usuario con la anotación definida por el usuario con la anotación @InterceptorBinding @InterceptorBinding

Page 84: CDI para Java EE 7

Interceptor BindingInterceptor Binding

Page 85: CDI para Java EE 7

Interceptor BindingInterceptor Binding

Page 86: CDI para Java EE 7

InterceptorsInterceptors

Los interceptors esta deshabitados por Los interceptors esta deshabitados por defecto. Al igual que las alternatives, los defecto. Al igual que las alternatives, los interceptors tienen que ser definidos en el interceptors tienen que ser definidos en el beans.xml del jar o módulo Java EE.beans.xml del jar o módulo Java EE.

Page 87: CDI para Java EE 7

InterceptorsInterceptors

Page 88: CDI para Java EE 7

Priorizando Interceptors Priorizando Interceptors BindingBinding

Si bien los Interceptors binding nos dan pobre Si bien los Interceptors binding nos dan pobre acoplamiento de interceptors, perdemos la acoplamiento de interceptors, perdemos la posibilidad de ordenarlos.posibilidad de ordenarlos.

Desde CDI 1.1 ya podemos hacerlo usando Desde CDI 1.1 ya podemos hacerlo usando @Priority@Priority

Page 89: CDI para Java EE 7

Priorizando Interceptors Priorizando Interceptors BindingBinding

Page 90: CDI para Java EE 7

Priorizando Interceptors Priorizando Interceptors BindingBinding

@Priority puede tomar un Integer de cualquier @Priority puede tomar un Integer de cualquier valor. valor.

La regla es que interceptors con prioridad La regla es que interceptors con prioridad pequeña son llamados primero.pequeña son llamados primero.

Java EE 7 define prioridades a nivel de la Java EE 7 define prioridades a nivel de la plataforma y podemos tener interceptors plataforma y podemos tener interceptors llamados antes o después de ciertos eventos.llamados antes o después de ciertos eventos.

Page 91: CDI para Java EE 7

Priorizando Interceptors Priorizando Interceptors BindingBinding

PLATFORM_BEFORE = 0: Inicio de un rango de interceptors PLATFORM_BEFORE = 0: Inicio de un rango de interceptors definidos por la plataforma Java EEdefinidos por la plataforma Java EE

LIBRARY_BEFORE = 1000: Inicio de un rango de interceptors LIBRARY_BEFORE = 1000: Inicio de un rango de interceptors definidos por extension librariesdefinidos por extension libraries

APPLICATION = 2000: Inicio de un rango de interceptors APPLICATION = 2000: Inicio de un rango de interceptors definidos por aplicacionesdefinidos por aplicaciones

LIBRARY_AFTER = 3000: Inicio de un rango de últimos LIBRARY_AFTER = 3000: Inicio de un rango de últimos interceptors definidos por extension librariesinterceptors definidos por extension libraries

PLATFORM_AFTER = 4000: Inicio de un rango de últimos PLATFORM_AFTER = 4000: Inicio de un rango de últimos interceptors definidos por la plataforma Java EEinterceptors definidos por la plataforma Java EE

Page 92: CDI para Java EE 7

Priorizando Interceptors Priorizando Interceptors BindingBinding

En Conclusión, si deseamos que nuestro En Conclusión, si deseamos que nuestro interceptor sea ejecutado antes de cualquier interceptor sea ejecutado antes de cualquier interceptor de aplicación, pero después de interceptor de aplicación, pero después de cualquier interceptor temprano de la plataforma cualquier interceptor temprano de la plataforma debemos escribir:debemos escribir:

Page 93: CDI para Java EE 7

DecoradoresDecoradores

Los decoradores son un patrón de diseño común de Los decoradores son un patrón de diseño común de Gang of Four. La idea es tomar una clase y wrap otra Gang of Four. La idea es tomar una clase y wrap otra clase alrededor de ella (decorarla).clase alrededor de ella (decorarla).

Es decir, si llamas a una clase decorada, pasamos, a Es decir, si llamas a una clase decorada, pasamos, a través, del decorador antes de llegar a la clase destino.través, del decorador antes de llegar a la clase destino.

Los Decoradores son especiales para añadir lógica Los Decoradores son especiales para añadir lógica adicional a un método de negocios.adicional a un método de negocios.

Son similares a los interceptors en cierta forma, pero Son similares a los interceptors en cierta forma, pero son complementariosson complementarios

Page 94: CDI para Java EE 7

DecoradoresDecoradores

Page 95: CDI para Java EE 7

DecoradoresDecoradoresLos decoradores deben tener un delegate Los decoradores deben tener un delegate injection point anotado con @Delegate, del injection point anotado con @Delegate, del mismo tipo que el bean que se esta decorando. mismo tipo que el bean que se esta decorando.

Esto permite al decorador invocar al objeto Esto permite al decorador invocar al objeto delegado y adicionalmente llamar a un método delegado y adicionalmente llamar a un método de negocio de este.de negocio de este.

Los decoradores por defecto están Los decoradores por defecto están deshabilitados. Estos deben ser habilitados en deshabilitados. Estos deben ser habilitados en el beans.xml el beans.xml

Page 96: CDI para Java EE 7

DecoradoresDecoradores

Page 97: CDI para Java EE 7

EventosEventos

Los Events permite a los beans interactuar fuera Los Events permite a los beans interactuar fuera del tiempo de compilación.del tiempo de compilación.

Un Bean puede definir un evento, otro puede Un Bean puede definir un evento, otro puede dispararlo y otro manejar el eventodispararlo y otro manejar el evento

Los beans pueden estar en paquetes separados y Los beans pueden estar en paquetes separados y aún en capas separadas de la aplicaciónaún en capas separadas de la aplicación

Este es el observer/observable design pattern del Este es el observer/observable design pattern del Gang of FourGang of Four

Page 98: CDI para Java EE 7

EventosEventos

Event producers disparan eventos usando la Event producers disparan eventos usando la interface Event. Un producer lanza eventos interface Event. Un producer lanza eventos llamando al método fire(), pasa el objeto event y no llamando al método fire(), pasa el objeto event y no es dependiente del observer.es dependiente del observer.

En el ejemplo que vamos a ver LibroService En el ejemplo que vamos a ver LibroService dispara un event (LibroAddedEvent) cada vez que dispara un event (LibroAddedEvent) cada vez que un Libro es creado. un Libro es creado.

Este fire(libro) dispara el evento y notifica a los Este fire(libro) dispara el evento y notifica a los metodos observer este particular evento.metodos observer este particular evento.

Page 99: CDI para Java EE 7

EventosEventos

Page 100: CDI para Java EE 7

EventosEventos

Page 101: CDI para Java EE 7

EventosEventos

Page 102: CDI para Java EE 7

Demos en Demos en

https://github.com/joedayz/javaee7-https://github.com/joedayz/javaee7-samplessampleshttps://github.com/joedayz/javaee7-https://github.com/joedayz/javaee7-samplessampleshttps://github.com/joedayz/javaee7-https://github.com/joedayz/javaee7-samplessamples

Page 103: CDI para Java EE 7

Libros RecomendosLibros Recomendos

http://oreil.ly/1jUrXhttp://oreil.ly/1jUrXDbDb

http://amzn.to/1bziehttp://amzn.to/1bzieKCKC

Page 104: CDI para Java EE 7

Participa en GitHubParticipa en GitHub

https://github.com/javaee-https://github.com/javaee-samplessamples

Page 105: CDI para Java EE 7

@[email protected]. Jose DiazIng. Jose Diaz

Gracias por su atenciónGracias por su atención

JOEDAYJOEDAYZZ