22/6/2020
Programación Distribuida
CDI: Contexts and Dependency Injection
JAIME SALVADOR
AGENDA
• Introducción
• Componentes
• Otros modelos de componentes
1
22/6/2020
Introducción
Qué es CDI?
Introducción
• Contexts and Dependency Injection (CDI) permite que los objetos obtengan sus
dependencias de forma automática.
Contexts + Dependency Injection
• Los objetos no son responsables de crear sus dependencias
• CDI maneja el ciclo de vida de los objetos
2
22/6/2020
Introducción
Introducción
3
22/6/2020
Introducción
Contexto
• Asociar componentes a un ámbito específico (por ejemplo stateful session bean)
• Crea los componentes cuando se los necesita (primer acceso) y los destruye cuando no son
necesarios
• El cliente no tiene que crear/destruir componentes
Introducción
Dependency injection
• Las dependencias de un objeto son creadas por un contenedor e inyectadas al objeto
dependiente.
4
22/6/2020
AGENDA
• Introducción
• Componentes
• Otros modelos de componentes
Componente
• En Java EE, un componente es una clase Java que contienen características adicionales:
• Es gestionado por un contenedor
• Pertenece a un ámbito (scope)
• Es sustituible (reemplazable)
• Es interceptable
• Tiene un ciclo de vida definido
• Tiene un nombre
5
22/6/2020
Componente
Es gestionado por un contenedor
• El desarrollador no instancia directamente las clases (no se utiliza new)
• Las clases son instanciadas por el contenedor
Cómo buscar un componente?
• Service Locator: la instancia de un componente se la obtiene llamando a algún método de una clase o
instancia
• Factory Method? (crea una nueva instancia)
Componente
// inicializar el contenedor
SeContainer container = SeContainerInitializer
.newInstance()
.initialize();
// buscar el objeto
Instance< Component > obj = container.select( Component.class );
Component servicio = obj.get();
// invocar el método
6
22/6/2020
Componente
FacesContext.getCurrentInstance().getApplication()
.evaluateExpressionGet(
FacesContext.getCurrentInstance(),
"#{someBean}",
ComponentBean.class );
@ManagedBean(name="someBean")
public class ComponentBean {
}
Componente
Pertenece a un ámbito (scope)
• Los componentes se almacenan en un repositorio "virtual"
• Request scope
• Session scope
• Application scope
7
22/6/2020
Componente
Pertenece a un ámbito (scope)
@RequestScoped
@ManagedBean(name="someBean")
public class ComponentBean {
Componente
Es sustituible (reemplazable)
• Los componentes pueden ser reemplazados por versiones compatibles sin que el cliente
tenga conocimiento.
• El cliente busca al componente por el nombre
• El contenedor puede retornar una implementación diferente
8
22/6/2020
Componente
Es interceptable
• Un componente es interceptable si el contenedor o el desarrollador puede agregar de
forma implícita o explícita interceptores a los métodos expuestos.
• Un interceptor es una bloque de código que se ejecuta antes o después de la ejecución de método sin que el
que invoca al método tenga conciencia de lo que sucede.
Componente
Es interceptable
9
22/6/2020
Componente
Tiene un ciclo de vida definido
• Todos los componentes Java EE tienen un ciclo de vida
• El contenedor invoca métodos en el componente en ciertos puntos de ejecución
(construcción, inicialización y destrucción)
• Este tipo de llamadas se denominan lifecycle callback
@PostConstruct y @PreDestroy
Componente
Tiene un ciclo de vida definido
public class MyCDIBean {
@PostConstruct
public void init( ) {
// initialize component
}
}
10
22/6/2020
Componente
Tiene un nombre
• La mayoría de componentes Java EE tienen asociado un nombre
@RequestScoped
@ManagedBean(name="someBean")
public class ComponentBean {
AGENDA
• Introducción
• Componentes
• Otros modelos de componentes
11
22/6/2020
Otros modelos de componentes
• Servlets
• EJB session beans y MDBs
• JSF managed beans
• JSF converters, phase listeners
• JCA
• JAX-RS
Introducción
Ejemplo
12
22/6/2020
Ejemplo
Ejemplo
package com.distribuida.cdi.servicios;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.inject.Named;
package com.distribuida.cdi.servicios;
@ApplicationScoped
public interface Operaciones {
@Named(value="operaciones")
int sumar(int a, int b);
public class OperacionesImpl implements Operaciones {
}
public int sumar(int a, int b) {
int ret = a + b;
return ret;
}
}
13
22/6/2020
Ejemplo
META-INF/beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
</beans>
Ejemplo
package com.distribuida.cdi;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.se.SeContainer;
import javax.enterprise.inject.se.SeContainerInitializer;
import com.distribuida.cdi.servicios.Operaciones;
public class PrincipalCdi {
public static void main(String[] args) {
// inicializar el contenedor
SeContainer container = SeContainerInitializer.newInstance().initialize();
// buscar el objeto de tipo Operaciones
Instance<Operaciones> obj = container.select( Operaciones.class );
Operaciones servicio = obj.get();
// invocar el método
int ret = servicio.sumar( 5, 9 );
System.out.printf( "Respuesta: %d\n", ret );
}
}
14
22/6/2020
Ejemplo
PREGUNTAS?
15