CDI para Java EE 7
-
Upload
jose-diaz -
Category
Technology
-
view
682 -
download
5
description
Transcript of CDI para Java EE 7
CDICDIContext and Dependency InjectionContext and Dependency Injection
Ing. Jose Diaz DiazIng. Jose Diaz DiazJOEDAYZJOEDAYZ
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
JoeDayz.pe PartnershipJoeDayz.pe Partnership
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"
¿Que son los Beans?¿Que son los Beans?
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
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
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.
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.
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
Inyección de Inyección de DependenciasDependencias
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
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
Ciclo de vida de un Bean Ciclo de vida de un Bean ManejadoManejado
Scopes y ContextScopes y Context
CDI viene con scopes predefinidos: request, CDI viene con scopes predefinidos: request, session, application y conversationsession, application y conversation
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.
InterceptionInterception
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
¿De que trata CDI?¿De que trata CDI?
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)
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)
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.
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
¿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
Principales CDI Principales CDI PackagesPackages
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
Escribiendo un bean CDIEscribiendo un bean CDI
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
Dependency InjectionDependency Injection
Dependency InjectionDependency Injection
@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
@Inject@Inject
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
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.
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].
Default InjectionDefault Injection
Default InjectionDefault Injection
QualifiersQualifiers
Cuando tenemos que escoger una Cuando tenemos que escoger una implementación especifica entonces usamos implementación especifica entonces usamos QualifiersQualifiers
QualifiersQualifiers
QualifiersQualifiers
QualifiersQualifiers
QualifiersQualifiers
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.
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.
Qualifiers con MiembrosQualifiers con Miembros
Qualifiers con MiembrosQualifiers con Miembros
Multiples QualifiersMultiples Qualifiers
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.
AlternativesAlternatives
AlternativesAlternatives
Si queremos que el alternativo Si queremos que el alternativo funcionefuncione
tenemos que habilitarlo en tenemos que habilitarlo en beans.xmlbeans.xml
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.
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.
ProducersProducers
ProducersProducers
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.
InjectionPoint APIInjectionPoint API
ProducerProducer
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.
DisposersDisposers
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
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)
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
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
ConversationConversation
ConversationConversation
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
Beans en Expression Beans en Expression LanguageLanguage
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
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.
Interceptor en la misma Interceptor en la misma claseclase
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
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
InvocationContext InvocationContext InterfaceInterface
InvocationContext InvocationContext InterfaceInterface
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
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
Clases InterceptorClases Interceptor
Clases InterceptorClases Interceptor
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
Interceptors de ciclo de Interceptors de ciclo de vidavida
Interceptors de ciclo de Interceptors de ciclo de vidavida
Encadenando y Encadenando y Excluyendo InterceptorsExcluyendo Interceptors
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
Interceptor BindingInterceptor Binding
Interceptor BindingInterceptor Binding
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.
InterceptorsInterceptors
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
Priorizando Interceptors Priorizando Interceptors BindingBinding
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.
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
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:
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
DecoradoresDecoradores
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
DecoradoresDecoradores
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
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.
EventosEventos
EventosEventos
EventosEventos
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
Libros RecomendosLibros Recomendos
http://oreil.ly/1jUrXhttp://oreil.ly/1jUrXDbDb
http://amzn.to/1bziehttp://amzn.to/1bzieKCKC
Participa en GitHubParticipa en GitHub
https://github.com/javaee-https://github.com/javaee-samplessamples
@[email protected]. Jose DiazIng. Jose Diaz
Gracias por su atenciónGracias por su atención
JOEDAYJOEDAYZZ