Los desarrolladores de aplicaciones puede utilizar JCDI (Java™ Contexts and Dependency Injection)
para tener distintos ámbitos para sus beans gestionados. Por ejemplo, si tiene una anotación @javax.enterprise.context.ApplicationScoped
en una clase Java denominada Foo y varios campos Foo anotados
con @javac.inject.Inject en beans gestionados, sólo hay una instancia Foo a nivel de toda la aplicación que exista realmente.
Acerca de esta tarea
Los ámbitos de ciclo de vida pueden ayudar a los desarrolladores de aplicaciones a gestionar su código.
Por ejemplo, si proporciona a los tipos Java una anotación de ámbito simple, puede asegurarse de que
se creará una única instancia gestionada para dicho ámbito, en lugar de la posibilidad de tener que escribir varias líneas de código para garantizar el comportamiento que desee.
Los ámbitos de ciclo de vida sólo se aplican a beans gestionados. Si el código de aplicación crea una nueva instancia de una clase, el código controla todo el ciclo de vida de dicha instancia única.
Sin embargo, en código gestionado como por ejemplo clases de recursos JAX-RS (API Java para servicios web RESTful)
donde el entorno de ejecución crea nuevas instancias automáticamente, el entorno de ejecución de JAX-RS asume la responsabilidad del ciclo de las clases.
Best practice: Añada ámbitos de ciclo de vida específicos a las clases de proveedor y recurso raíz JAX-RS que existan en la aplicación, en un archivo habilitado para JCDI.
Para clases de recursos JAX-RS con una anotación
@javax.ws.rs.Path, puede utilizar
@javax.enterprise.context.RequestScoped.
Para las subclases
javax.ws.rs.core.Application y las clases anotadas
@javax.ws.rs.ext.Provider,
debe utilizar
@javax.enterprise.context.ApplicationScoped.
bprac
En las instrucciones siguientes se describe cómo puede utilizar
los ámbitos de ciclo de vida de una aplicación web habilitada para JCDI simple con JAX-RS:
- Añada un descriptor de despliegue beans.xml a la aplicación web (WAR)
en el directorio WEB-INF. La existencia del archivo WEB-INF/beans.xml indica que el archivo es un archivo habilitado para JCDI. No es necesario añadir ninguna información adicional para esta tarea. En el ejemplo siguiente se muestra un archivo WEB-INF/beans.xml básico:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance" xsi:schemeLocation="http://java.sun.com/xml/ns/javaee http:/
/java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<!-- Expresamente vacío. -->
</beans>
- Cree una clase de recurso raíz JAX-RS. En el ejemplo siguiente se muestra una clase de recurso raíz JAX-RS simple:
package com.example.jaxrs;
@javax.ws.rs.Path("exampleWithLifecycle")
public class StringResource {
@javax.ws.rs.GET
@javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
public String get() {
return "Hello world!";
}
}
- Añada un ámbito de ciclo de vida JCDI a las clases JAX-RS. Añada la anotación de ámbito @javax.enterprise.context.RequestScoped a las clases de recuso raíz:
Best practice: Añada la anotación
@javax.enterprise.context.RequestScoped a las clases de recurso
raíz para asegurarse de que el recurso raíz JAX-RS tenga un nombre de instancia exclusiva por solicitud. Éste es el comportamiento
predeterminado en aplicaciones no habilitadas para JCDI.
bprac
package com.example.jaxrs;
@javax.enterprise.context.RequestScoped
@javax.ws.rs.Path("exampleWithLifecycle")
public class StringResource {
@javax.ws.rs.GET
@javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
public String get() {
return "Hello world!";
}
}
- (opcional) Para las clases anotadas @javax.ws.rs.ext.Provider o las subclases javax.ws.rs.core.Application,
debe añadir @javax.enterprise.context.ApplicationScoped a la clase. En el siguiente ejemplo se muestra cómo modificar el proveedor JAX-RS o la subclase de aplicación con una anotación de ámbito @javax.enterprise.context.ApplicationScoped:
package com.example.jaxrs;
@javax.enterprise.context.ApplicationScoped
@javax.ws.rs.ext.Provider
public class Example implements javax.ws.rs.ext.MessageBodyWriter<CustomType> {
public long getSize(String t,
Class<?> type,
Type genericType,
Annotation[] annotations,
javax.ws.rs.core.MediaType mediaType) {
return -1;
}
public boolean isWriteable(Class<?> type,
Type genericType,
Annotation[] annotations,
javax.ws.rs.core.MediaType mediaType) {
return CustomType.class == type;
}
public void writeTo(String t,
Class<?> type,
Type genericType,
Annotation[] annotations,
javax.ws.rs.core.MediaType mediaType,
javax.ws.rs.core.MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream) throws IOException {
/* escribir algo en la secuencia de entidad */
}
}