Les développeurs d'applications peuvent utiliser JDCI (Java™ Contexts and Dependency Injection) pour avoir différentes portées pour leurs beans gérés. Par exemple, si vous avez une annotation @javax.enterprise.context.ApplicationScoped sur une classe
Java nommée Foo et plusieurs zones Foo annotées avec @javac.inject.Inject dans des beans gérés, il n'existe effectivement qu'une seule instance Foo de portée application.
Pourquoi et quand exécuter cette tâche
Les portées de cycle de vie peuvent aider les développeurs d'applications à gérer leur code. Par exemple, en attribuant à des types Java une annotation de portée simple, vous pouvez faire en sorte qu'une seule instance gérée soit créée pour cette portée au lieu de devoir potentiellement écrire plusieurs lignes de code pour garantir le comportement souhaité.
Les portées de cycle de vie s'appliquent uniquement aux beans gérés. Si votre code d'application crée une nouvelle
instance d'une classe, votre code contrôle la totalité du cycle de vie de cette instance unique. Toutefois, dans un code géré tel que des classe de ressources JAX-R (Java API for RESTful Web Services) dans lequel l'environnement d'exécution crée pour vous de nouvelles instances, l'environnement d'exécution JAX-RS est responsable du cycle de vie de vos classes.
Pratiques recommandées: Ajoutez des portées de cycle de vie spécifiques à toutes les classes de ressources et de fournisseur racine JAX-RS existant dans votre application, dans une archive compatible JCDI. Pour une classe de ressources JAX-RS avec une annotation
@javax.ws.rs.Path, vous pouvez utiliser
@javax.enterprise.context.RequestScoped.
Pour des sous-classes
javax.ws.rs.core.Application et des classes annotées
@javax.ws.rs.ext.Provider, vous devez utiliser
@javax.enterprise.context.ApplicationScoped.
bprac
Les instructions suivantes expliquent comment utiliser des portées de cycle de vie pour une application Web compatible JCDI simple avec JAX-RS :
- Ajoutez un descripteur de déploiement beans.xml à votre fichier WAR d'application Web dans le répertoire WEB-INF. L'existence du fichier WEB-INF/beans.xml indique que l'archive est une archive JCDI. Vous n'avez pas besoin d'y ajouter des informations supplémentaires pour cette tâche. L'exemple suivant illustre un fichier WEB-INF/beans.xml de base :
<?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">
<!-- Vide exprès. -->
</beans>
- Créez une classe de ressources racine JAX-RS. L'exemple suivant illustre une classe de ressources racine 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!";
}
}
- Ajoutez une portée de cycle de vie JCDI à vos classes JAX-RS. Ajoutez l'annotation de portée @javax.enterprise.context.RequestScoped à vos classes de ressources racine :
Pratiques recommandées: Ajoutez l'annotation
@javax.enterprise.context.RequestScoped à vos classes de ressources racine pour faire en sorte que votre classe de ressources racine JAX-RS n'ait qu'une seule instance par demande. Il s'agit du comportement par défaut dans les applications non 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!";
}
}
- (Facultatif) Pour les classes annotées @javax.ws.rs.ext.Provider personnalisées ou les sous-classes javax.ws.rs.core.Application, vous devez ajouter @javax.enterprise.context.ApplicationScoped à votre classe. L'exemple suivant montre comment modifier votre sous-classe de fournisseur ou d'application JAX-RS avec une annotation de portée @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 {
/* écrire quelque chose pour le flux d'entité */
}
}