Java™ Contexts and
Dependency Injection (JCDI) unterstützt die Abhängigkeitsinjektion in Managed Beans.
Wenn Sie JCDI in Ihrer Webanwendung konfigurieren, können Sie
mit @javax.inject.Inject annotierte Felder und Eigenschaften hinzufügen.
Wenn die annotierten Felder und Eigenschaften gültige Injektionspunkte sind, werden ihre Abhängigkeiten zur Laufzeit aufgelöst.
Die Abhängigkeitsinjektion trennt die Erstellung neuer Instanzen von
Java-Typen von der Verwendung dieser Java-Typen im Code.
Die Abhängigkeitsinjektion kann die Testfähigkeit von Code erhöhen und gleichzeitig
die Verwaltung von Anwendungen vereinfachen.
Informationen zu diesem Vorgang
In dieser Task konfigurieren Sie Ihre Anwendung für die Verwendung von JCDI, indem Sie einen
Implementierungsdeskriptor beans.xml hinzufügen.
Anschließend erstellen Sie einen Standard-JAX-RS-Ressourcentyp (Java API
for RESTful Web Services) mit einem Feld @javax.inject.Inject, das zur Laufzeit aufgelöst wird.
Die folgenden Anweisungen
beschreiben, wie Sie eine einfache Webanwendung, die JCDI unterstützt,
mit JAX-RS erstellen:
Vorgehensweise
- Fügen Sie Ihrer Webanwendung (WAR-Datei) im Verzeichnis
WEB-INF einen Implementierungsdeskriptor beans.xml hinzu. Damit wird angezeigt, dass die Webanwendung JCDI unterstützt.
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 dem Implementierungsdeskriptor 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("exampleWithInjection")
public class StringResource {
public StringResource() {
/* Konstruktor ohne Argument verwenden */
}
@javax.ws.rs.core.Context
private javax.ws.rs.core.HttpHeaders httpHeaders;
@javax.annotation.PostConstruct
private void myPostConstruct() {
/* Sofern erforderlich, aus den HTTP-Headern lesen */
}
@javax.ws.rs.GET
@javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
public String get() {
return "Hello world!";
}
}
Im vorherigen Code wurde ein Konstruktor ohne Argument verwendet.
Ein Konstruktor ohne Argument ist ein gültiger JCDI-Konstruktor, der aus der Klasse eine gültige
JCDI-Bean macht. Wenn Sie während der Objektinstanziierung JAX-RS-Kontextobjekte oder -Parameter
injizieren möchten, können Sie Beaneigenschaften oder -felder verwenden.
Verwenden Sie anschließend eine mit @javax.annotation.PostConstruct annotierte Methode, die nach der Erstellung des Objekts aufgerufen wird.
- Fügen Sie Ihren JAX-RS-Klassen einen JCDI-Lebenszyklusbereich hinzu. Das folgende Beispiel veranschaulicht eine einfache JAX-RS-Stammressourcenklasse mit
einer Annotation @javax.enterprise.context.RequestScoped:
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.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!";
}
}
- Erstellen Sie eine Klasse, die in die JAX-RS-Stammressource injiziert wird. Das folgende Beispiel veranschaulicht eine Standard-Java-Klasse:
package com.example.jaxrs;
public class Data {
public String getData() {
return "Hello world!";
}
}
- Ändern Sie Ihre JAX-RS-Stammressource, und fügen Sie ihr ein mit
@javax.inject.Inject annotiertes Feld für den Typ
com.example.jaxrs.Data hinzu. Das folgende Beispiel veranschaulicht eine geänderte JAX-RS-Stammressourcenklasse mit einem
@javax.inject.Inject-Injektionspunkt:
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;
}
Zur Laufzeit wird bei der Erstellung der JAX-RS-Stammressource
eine Instanz des Typs Data in das Feld
myData injiziert. Dies ist nur ein einfaches Beispiel für Injektion, aber
JCDI unterstützt auch wesentlich komplexere Anwendungsfälle.
Weitere Einzelheiten finden Sie in der JCDI-Spezifikation.
- Fügen Sie Ihrer WAR-Datei eine Datei web.xml der Servlet Version 3.0 hinzu. Im folgenden Beispiel wird eine JAX-RS-Standardanwendungsservletdefinition hinzugefügt,
die alle JAX-RS-Stammressourcen unter dem URL-Muster /rest/* verfügbar macht:
<?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>
Ergebnisse
Sie haben eine Webanwendung für die Verwendung von JCDI konfiguriert, eine
JAX-RS-Ressource mit JCDI-Lebenszyklus und einen Standardinjektionspunkt erstellt.