JCDI (Java™ Contexts and
Dependency Injection) da soporte a la inyección de dependencia en beans gestionados.
Configurando la aplicación web para que esté habilitada para JCDI, puede añadir
campos anotados @javax.inject.Inject y propiedades.
Si los campos anotados y las propiedades son puntos de inyección válidos con beans
gestionados JCDI válidos, sus dependencias se resolverán en tiempo de ejecución. La inyección de dependencia separa la creación de instancias nuevas
de tipos Java del uso de los tipos Java en el código. La inyección de dependencia puede permitir
probar código más fácilmente, al mismo tiempo que mejora la capacidad de gestión de aplicaciones.
Acerca de esta tarea
En esta tarea, puede configurar la aplicación para utilizar JCDI añadiendo un descriptor de despliegue beans.xml.
A continuación, crea un tipo de recurso JAX-RS (API Java para servicios web RESTful)
estándar con un campo @javax.inject.Inject, que se resolverá durante el tiempo de ejecución.
En las instrucciones siguientes se describe cómo puede
crear una aplicación web habilitada para JCDI simple con JAX-RS:
Procedimiento
- Añada un descriptor de despliegue beans.xml a la aplicación web (WAR)
en el directorio WEB-INF. Esto indica que la aplicación web debe ser una aplicación habilitada para JCDI. 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 al descriptor
de despliegue 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("exampleWithInjection")
public class StringResource {
public StringResource() {
/* utilizar un contructor sin argumentos */
}
@javax.ws.rs.core.Context
private javax.ws.rs.core.HttpHeaders httpHeaders;
@javax.annotation.PostConstruct
private void myPostConstruct() {
/* si se requiere, leer httpHeaders */
}
@javax.ws.rs.GET
@javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
public String get() {
return "Hello world!";
}
}
En el código anterior, se ha utilizado un constructor sin argumentos. Un constructor sin argumentos es un constructor JCDI válido, lo cual hace que la clase sea un bean JCDI válido.
Si desea incluir objetos de contexto o parámetros JAX-RS durante la creación de la instancia del objeto, puede utilizar propiedades o campos del bean.
A continuación, utilice un método anotado @javax.annotation.PostConstruct, al que se llama una vez que se ha construido el objeto.
- Añada un ámbito de ciclo de vida JCDI a las clases JAX-RS. En el ejemplo siguiente se muestra una clase de recurso raíz JAX-RS con una anotación de ámbito @javax.enterprise.context.RequestScoped:
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.ws.rs.Path("exampleWithInjection")
@javax.enterprise.context.RequestScoped
public class StringResource {
@javax.ws.rs.GET
@javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
public String get() {
return "Hello world!";
}
}
- Cree una clase que se inyecte en el recurso raíz JAX-RS. En el ejemplo siguiente se muestra una clase Java estándar:
package com.example.jaxrs;
public class Data {
public String getData() {
return "Hello world!";
}
}
- Modifique el recurso raíz JAX-RS para añadir un campo anotado @javax.inject.Inject para el tipo com.example.jaxrs.Data. En el ejemplo siguiente se muestra una clase de recurso raíz JAX-RS modificada con un punto de inyección @javax.inject.Inject:
package com.example.jaxrs;
@javax.ws.rs.Path("exampleWithInjection")
@javax.enterprise.context.RequestScoped
public class StringResource {
@javax.ws.rs.GET
@javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
public String get() {
return myData.getData();
}
@javax.inject.Inject
private Data myData;
}
Durante el tiempo de ejecución, cuando se construye el recurso raíz JAX-RS, una instancia del tipo Data se inyecta
en el campo myData. Aunque esto es una forma sencilla de inyección, JCDI permite casos de uso más complejos. Lea la especificación JCDI para obtener más detalles.
- Añada un archivo web.xml del Servlet 3.0 al archivo WAR. En el ejemplo siguiente, se añade una definición de servlet de aplicación JAX-RS predeterminada, lo que hace que todos los
recursos raíz JAX-RS estén disponibles en el patrón de URL /rest/*:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/
XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/
j2ee/web-app_3_0.xsd" version="3.0">
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Resultados
Ha configurado una aplicación web para utilizar JCDI, ha creado un recurso JAX-RS con ámbito de ciclo de vida JCDI y
ha creado un punto de inyección estándar.