O Java™ Contexts and Dependency Injection (JCDI) suporta injeção de dependência em beans gerenciados. Ao configurar o seu aplicativo da Web para ser ativado para JCDI, é possível incluir campos e propriedades anotados @javax.inject.Inject. Se os campos e propriedades anotados são pontos de injeção válidos com beans gerenciados JCDI, então suas dependências serão resolvidas durante o tempo de execução. A injeção de dependência separa a criação de novas instâncias de tipos Java a partir do uso desses tipos Java no código. A injeção de dependência permite código mais facilmente testável, enquanto também melhora a capacidade de gerenciar aplicativos.
Sobre Esta Tarefa
Nessa tarefa, você configura o seu aplicativo para usar o JCDI, incluindo um descritor de implementação beans.xml.
Depois, você cria um tipo de recurso Java API for RESTful Web Services (JAX-RS) padrão com um campo @javax.inject.Inject, o que será resolvido durante o tempo de execução.
As instruções a seguir descrevem como é possível criar um aplicativo da Web ativado para JCDI simples com JAX-RS:
Procedimento
- Inclua um descritor de implementação beans.xml no seu web application (WAR) no diretório WEB-INF. Isso indica que o aplicativo da Web deve ser um aplicativo ativado para JCDI. A existência do arquivo WEB-INF/beans.xml indica que o archive é um archive ativado para JCDI. Você não é solicitado a incluir nenhuma informação adicional no descritor de implementação para essa tarefa. O exemplo a seguir ilustra uma arquivo 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">
<!-- Isso está vazio de propósito. -->
</beans>
- Crie uma classe de recurso raiz JAX-RS. O exemplo a seguir ilustra uma classe de recurso raiz JAX-RS:
package com.example.jaxrs;
@javax.ws.rs.Path("exampleWithInjection")
public class StringResource {
public StringResource() {
/* use a no-argument constructor */
}
@javax.ws.rs.core.Context
private javax.ws.rs.core.HttpHeaders httpHeaders;
@javax.annotation.PostConstruct
private void myPostConstruct() {
/* leia de httpHeaders se necessário */
}
@javax.ws.rs.GET
@javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
public String get() {
return "Hello world!";
}
}
No código anterior, foi usado um construtor sem argumento. Um construtor sem argumento é um construtor JCDI válido, que torna a classe um bean JCDI válido. Se desejar injetar objetos de contexto ou parâmetros JAX-RS durante a instanciação do objeto, é possível usar propriedades ou campos de bean. Então use um método anotado @javax.annotation.PostConstruct, que é chamado após o objeto ser construído.
- Inclua um escopo de ciclo de vida JCDI nas suas classes JAX-RS. O seguinte exemplo ilustra uma classe de recurso raiz JAX-RS com uma anotação de escopo @javax.enterprise.context.RequestScoped:
Boas Práticas: Inclua a anotação
@javax.enterprise.context.RequestScoped em suas classes de recurso raiz para garantir que a sua classe de recurso raiz JAX-RS tem uma instância única por pedido. Esse é o comportamento padrão em aplicativos não ativados 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!";
}
}
- Crie uma classe que é injetada no recurso raiz JAX-RS. O exemplo a seguir ilustra uma classe Java padrão:
package com.example.jaxrs;
public class Data {
public String getData() {
return "Hello world!";
}
}
- Modifique o seu recurso raiz JAX-RS para incluir um campo anotado @javax.inject.Inject para o tipo com.example.jaxrs.Data. O seguinte exemplo ilustra uma classe de recurso raiz JAX-RS modificada com um ponto de injeção @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 o tempo de execução, quando o recurso raiz JAX-RS é construído, uma instância do tipo Data é injetada no campo myData. Enquanto essa é uma forma simples de injeção, o JCDI permite casos de uso mais complexos. Consulte a especificação JCDI para obter detalhes adicionais.
- Inclua um arquivo web.xml do Servlet 3.0 no seu arquivo WAR. No exemplo a seguir, a definição de servlet de aplicativo JAX-RS é incluída, o que torna todos os recursos raiz JAX-RS disponíveis no padrão 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
Você configurou um aplicativo da Web para usar o JCDI, criou um recurso JAX-RS com escopo definido de ciclo de vida do JCDI, e criou um ponto de injeção padrão.