Os desenvolvedores de aplicativos podem usar o Java™ Contexts and Dependency Injection (JCDI) para ter diferentes escopos de seus beans gerenciados. Por exemplo, se
você tiver uma anotação @javax.enterprise.context.ApplicationScoped
em uma classe Java denominada Foo e
diversos campos Foo anotados para @javac.inject.Inject
em beans gerenciados, haverá apenas uma instância Foo com escopo no aplicativo
que realmente existe.
Sobre Esta Tarefa
Escopos de ciclo de vida podem ajudar os desenvolvedores de aplicativos a gerenciar seu código. Por exemplo, ao fornecer aos tipos Java uma anotação de escopo simples, é possível assegurar que uma instância seja criada para esse escopo, em vez de ter de potencialmente escrever diversas linhas de código para garantir o comportamento que você deseja.
Os escopos de ciclo de vida apenas se aplicam a beans gerenciados. Se o seu código do aplicativo criar uma nova instância de uma classe, o seu código controla o ciclo de vida inteiro dessa única instância. Porém, em código gerenciado como classes de recurso Java API for RESTful Web Services (JAX-RS) em que o ambiente de tempo de execução cria novas instâncias para você, o ambiente de tempo de execução JAX-RS assume a responsabilidade pelo ciclo de vida das suas classes.
Boas Práticas: Inclua escopos de ciclo de vida específicos em qualquer recurso raiz JAX-RS e classes do provedor que existam no seu aplicativo, em um archive ativado para JCDI. Para classes de recurso JAX-RS com uma anotação
@javax.ws.rs.Path, é possível usar
@javax.enterprise.context.RequestScoped.
Para subclasses
javax.ws.rs.core.Application e classes anotadas
@javax.ws.rs.ext.Provider, você deve usar
@javax.enterprise.context.ApplicationScoped.
bprac
As instruções a seguir descrevem como usar escopos de ciclo de vida para um aplicativo da Web ativado para JCDI simples com JAX-RS:
- Inclua um descritor de implementação beans.xml no seu web application (WAR) no diretório WEB-INF. 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 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:
pacote 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!";
}
}
- Inclua um escopo de ciclo de vida JCDI nas suas classes JAX-RS. Inclua a anotação de escopo @javax.enterprise.context.RequestScoped em suas classes de recurso raiz:
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
pacote 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 quaisquer classes anotadas @javax.ws.rs.ext.Provider customizadas ou subclasses javax.ws.rs.core.Application, você deve incluir @javax.enterprise.context.ApplicationScoped na sua classe. O exemplo a seguir ilustra como modificar o seu provedor JAX-RS ou subclasse do aplicativo com uma anotação de escopo @javax.enterprise.context.ApplicationScoped:
pacote 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 {
/* gravar alguma coisa no fluxo da entidade */
}
}
Resultados
Você configurou um aplicativo da Web para usar o JCDI, e criou um provedor e recurso JAX-RS com escopo de ciclo de vida, JCDI.