Anwendungsentwickler können
Java™ Contexts and Dependency Injection
(JCDI) mit verschiedenen Bereichen für ihre verwalteten Beans verwenden.
Wenn Sie beispielsweise eine Annotation @javax.enterprise.context.ApplicationScoped
in einer Java-Klasse mit dem Namen Foo
und mehrere mit @javac.inject.Inject annotierte Felder Foo
in verwalteten Beans haben, gibt es nur einzige anwendungsbezogene Instanz von Foo,
die tatsächlich vorhanden ist.
Informationen zu diesem Vorgang
Lebenszyklusebenen können Anwendungsentwickler bei der
Verwaltung ihres Codes helfen.
Indem Sie beispielsweise Java-Typen eine einfache
Bereichsannotation zuordnen, können Sie sicherstellen, dass eine einzige verwaltete Instanz für diesen Bereich
erstellt wird, anstatt unter Umständen mehrere Zeilen von Code schreiben zu müssen, die das gewünschte
Verhalten gewährleisten.
Lebenszyklusbereiche gelten nur für verwaltete Beans.
Wenn Ihr Anwendungscode eine neue Instanz einer Klasse erstellt,
steuert Ihr Code den gesamten Lebenszyklus dieser einzigen Instanz.
In verwaltetem Code, wie z. B.
JAX-RS-Ressourcenklassen (Java API for RESTful Web Services), in dem die Laufzeitumgebung
neue Instanzen für Sie erstellt,
übernimmt die JAX-RS-Laufzeitumgebung jedoch die Verantwortung für den Lebenszyklus Ihrer Klassen.
Bewährtes Verfahren: Fügen Sie allen
JAX-RS-Stammressourcen- und -Providerklassen in Ihrer Anwendung in einem Archiv, das JCDI unterstützt,
spezielle Lebenszyklusbereiche hinzu.
Für JAX-RS-Ressourcenklassen mit einer Annotation
@javax.ws.rs.Path können Sie
@javax.enterprise.context.RequestScoped verwenden.
Für
javax.ws.rs.core.Application-Unterklassen und
mit
@javax.ws.rs.ext.Provider annotierte Klassen müssen Sie
@javax.enterprise.context.ApplicationScoped verwenden.
bprac
Die folgenden Anweisungen
beschreiben, wie Sie Lebenszyklusbereiche für eine einfache Webanwendung, die JCDI unterstützt,
mit JAX-RS verwenden:
- Fügen Sie Ihrer Webanwendung (WAR-Datei) im Verzeichnis
WEB-INF einen Implementierungsdeskriptor beans.xml hinzu. Das Vorhandensein der Datei WEB-INF/beans.xml zeigt an, dass es sich bei dem Archiv
um ein Archiv handelt, das JCDI unterstützt.
Für diese Task müssen Sie keine weiteren Informationen hinzufügen.
Das folgende Beispiel veranschaulicht eine Basisdatei WEB-INF/beans.xml:
<?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">
<!-- Absichtlich leer. -->
</beans>
- Erstellen Sie eine JAX-RS-Stammressourcenklasse. Das folgende Beispiel veranschaulicht eine einfache JAX-RS-Stammressourcenklasse:
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!";
}
}
- Fügen Sie Ihren JAX-RS-Klassen einen JCDI-Lebenszyklusbereich hinzu. Fügen Sie Ihren Stammressourcenklassen die Bereichsannotation @javax.enterprise.context.RequestScoped
hinzu:
Bewährtes Verfahren: Fügen Sie Ihren Stammressourcenklassen die Annotation
@javax.enterprise.context.RequestScoped hinzu, um sicherzustellen, dass Ihre JAX-RS-Stammressourcenklasse
eine eindeutige Instanz pro Anforderung hat.
Dies ist das Standardverhalten in Anwendungen, die JCDI nicht unterstützen.
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!";
}
}
- (Optional) Für alle angepassten mit @javax.ws.rs.ext.Provider annotierten Klassen oder
für javax.ws.rs.core.Application-Unterklassen müssen Sie Ihrer Klasse
@javax.enterprise.context.ApplicationScoped hinzufügen. Das folgende Beispiel veranschaulicht, wie Sie Ihren
JAX-RS-Provider oder Ihre Anwendungsunterklasse mit einer Bereichsannotation
@javax.enterprise.context.ApplicationScoped ändern:
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 {
/* Daten in den Entitätsdatenstrom schreiben */
}
}