2. Oktober 2015 | 3 min lesezeit

JSR 365 – CDI 2.0

CDI 2.0 (JSR 365) ist die nächste Version des Standards für Dependency Injection in Java EE. Mit der zweiten Major-Version stehen einige zentrale Erweiterungen ins Haus, die CDI sowohl den Weg zu Java SE und Java 8 ebnen als auch asynchrone Events innerhalb des CDI Containers unterstützen sollen.

Seit seiner Einführung in Java EE 6 hat sich CDI zu einem unverzichtbaren Teil von Java EE entwickelt. Der anhaltende Erfolg führte zu der deutlichen Forderung der Community nach einer noch engeren Integration mit anderen JEE Spezifikationen. Im Rahmen der Community Umfrage zu Java EE 8 votierte eine große Mehrheit der Teilnehmer u.a. für die Einführung eines allgemeinen Security Interceptor, eine Generalisierung des EJB Timer Service und die Ausweitung von CDI Events und Observer Methoden auf weitere Services. Basierend auf der Umfrage wurden sechs Hauptthemen definiert, die nachfolgend im Detail vorgestellt werden.

  • Nutzung von Java 8 Features,
  • Java SE Support,
  • Modularität,
  • Ausbau des Event Systems,
  • Verbesserungen für Interceptoren und Decorator sowie
  • SPI und Context Erweiterungen.

Java 8 wurde im März 2014 veröffentlicht. Somit kam die Verwendung von Lambdas, Streams und Co. für CDI 1.1 und 1.2 (die Spezifikationen im Rahmen von Java EE 7) nicht in Frage. Dies wird sich nun ändern. In CDI 2.0 werden nicht nur die Neuerungen auf neue Sprachfeatures wie die CompletionStage API und Repeatable Annotations setzen, es wird auch geprüft wie bereits bestehenden Teile der Spezifikation von Java 8 profitieren können.

Wesentlich bedeutender ist der Einzug des Java SE Supports. Obwohl bereits der erste Dependency-Injection Standard (JSR-330) Java SE als Zielplattform hatte, wurde CDI bisher ausschließlich für Java EE entwickelt. Dort wird der CDI Container vom Applikationsserver gesteuert – in einer Java SE Anwendung muss hingegen die Anwendung den Container starten. Hierzu war es bisher notwendig auf implementierungsspezifische APIs wie Weld SE und OpenWebBeans zurückzugreifen (oder zu Spring wechseln). Mit CDI 2.0 wird nun eine standardisierte API zum Starten des Containers eingeführt und damit einhergehend gleich der Name des Frameworks in Contexts & Dependency Injection for Java  (ohne ‚EE‘) geändert.

Neben dem Java SE Support steht CDI 2.0 ganz im Zeichen der Modularität. Ähnlich wie EJB zählt auch die CDI Spezifikation aufgrund der Größe und des Featureumfangs zu den Schwergewichten in Java EE. Da viele Frameworks und Spezifikation jedoch nur einen Bruchteil der Funktionalität benötigen, entschieden sich einige in der Vergangenheit, CDI nicht oder nur teilweise zu implementieren. Um CDI zu vereinfachen, soll die Spezifikation voraussichtlich in drei Teile gesplittet werden, die unterschiedliche Teilmengen behandeln. Diese werden nicht von einander abhängig sein, aber den jeweils kleineren Part integrieren. Damit liegt die Entscheidung bei den Projekten und JSRs, welche Teile sie verwenden möchten.

  • CDI Light: eine leichtgewichtige Variante ohne Normal Scopes, Interceptoren und Decorator, die Implementierungen ohne Proxy erlaubt
  • CDI Full: in der heute bekannten Form ohne die Integration für andere Spezifikationen (Servlet, JSF, EJB, etc…​).
  • CDI Java EE: CDI full inklusive Integration mit anderen Spezifikationen

Ein Nachteil des CDI Event System sind bisher die fehlende Asynchronität und Priorisierung. D.h. dass bisher alle Events synchron und in nicht definierbarer Reihenfolge verarbeitet werden. Asynchrone Events können zwar über einen Workaround bereits heute genutzt werden, jedoch muss hierfür auf die @Asynchronous Annotation aus der EJB-Spec zurückgegriffen werden. Eine Sortierung der Events und damit die Aufrufreihenfolge von Event Observer Methoden, soll in CDI 2.0 analog wie bei Interceptoren über die @Priority Annotation realisiert werden. Für asynchrone Events wird eine neue Methode mit den Namen fireAsync sowie eine zusätzliche Observer Annotation (@ObservesAsync) hinzugefügt. Die Hintergründe dafür lassen sich hier nachlesen.

Neben der Fülle an Features werden sind in CDI 2.0 auch eine Reihe von Verbesserungen für Interceptoren und Decorator vorgesehen. U.a. sollen Interceptoren an Producer-Methoden und Methodenaufrufen innerhalb einer Klasse ermöglicht werden. Darüber hinaus können Qualifier und Interceptor Bindings in Zukunft Repeatable Annotations nutzen.

Die offizielle Informationen zum JSR 365 lassen sich unter https://jcp.org/en/jsr/detail?id=365 nachlesen. Weitere Informationen finden sich auf der Projektseite und in unserer Enterprise Kolumne (Asynchrone Events, CDI in Java SE nutzen).


Keine Kommentare

Kontakt

OPEN KNOWLEDGE GmbH

Standort Oldenburg:
Poststraße 1, 26122 Oldenburg

Standort Essen:
II. Hagen 7, 45127 Essen