Was kommt mit JEE 6 – JSR 299 (Web Beans) Präsentation von Gavin King

Wer wissen möchte in welche Richtung es in Java EE 6 geht wird nicht darum herumkommen sich mit dem JSR 299, auch Web Beans genannt, zu beschäftigen. Der Fokus des JSR 299 liegt auf der Vereinfachung von Dependency Injection in einer JEE Umgebung zwischen allen Schichten und diese auf vielfältige Art und Weise. Vor allem das Problem von der View (JSF oder JSP) auf EJBs einfach zugreifen zu können soll damit behoben werden aber auch vieles mehr vereinfacht. Web Beans selbst beschreibt sich auf der Web Beans Webseite in einem Satz so:

Java Contexts and DependencyInjection (JSR-299) is a new Java standard for dependency injection and contextual lifecycle management.

Wer Erfahrung mit dem JBoss Seam Framework hat wird viel Vertrautes im JSR 299 wiederfinden denn ähnlich wie für die JPA Spezifikation viel von Hibernate übernommen wurde ist für den JSR 299 viel von Seam übernommen worden.

Präsentationsfolien

Einen kleinen Einblick in JEE 6 und somit auch in den JSR 299 konnte man schon durch den Podcast von Dan Allen im Teil 2 hören. Nun hat Gavin King eine Präsentation über den JSR 299 gehalten und diese Folien, welche viele Code Beispiele enthalten, online gestellt.

JSR 299 Präsentation von Gavin King

Hier ist der dazugehörige Post auf dem “In Relation To” Blog (Direktdownload des PDFs).

Code Beipsiele

Einen kleinen Ausschnitt aus der Präsentation möchte ich direkt hier posten und erläutern um das Grundprinzip von Dependency Injection mit dem JSR 299 in einer Webanwendung zu verdeutlichen.

Binding Types:
Ein Binding Type lässt einen Client zwischen verschiedenen Implementierungen (Interface) oder Ableitungen (Klassen) eines bestimmten Typs anhand eines Binding Type Namens wählen.

Dazu wird erst der eigentliche Binding Type, ähnliche wie ein EJB Intercetpor, definiert:

public
@BindingType
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
@interface Informal {}

Dieser neue Binding Type mit dem Namen Informal kann nun an einer konkreten Klasse verwendet werden. So wird definiert, dass der Binding Type @Informal zu der konkreten Klasse InformalGreeting gehört:

@Informal
public class InformalGreeting extends Greeting {
  public String greet(String name) {
    return "hello " + name;
  }
}

Jetzt kommt das eigentliche Dependency Injection in der Bussiness Komponente, die selbst z.B. eine EJB oder auch zukünftig durch den JSR 299 einfach nur ein POJO sein könnte. Die Klasse Printer erhält die Informal-Implementierung des Oberklasse Greeter injected. Das wird durch den neuen definierten Typ mit der Annotation @Informal angegeben.

public class Printer {

  @Informal Greeting greeting;

  public void greet() {
    System.out.println( greeting.greet("Markus") );
  }
}

Möchte man jetzt z.B. noch eine formelle Begrüßung ermöglichen würde man einen zweiten Binding Type erstellen:

public
@BindingType
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
@interface Formal {}

Diesen definiert man anschließend an einer weiteren Ableitung der Klasse Greeting:

@Formal
public class InformalGreeting extends Greeting {
  public String greet(String name) {
    return "hello " + name;
  }
}

Möchte man nun in seiner Business Komponente die formale Begrüßung verwenden tauscht man lediglich die Annotation aus:

public class Printer {

  @Formal Greeting greeting;

  public void greet() {
    System.out.println( greeting.greet("Markus") );
  }
}

Mehr über Binding Types im JSR 299 kann auch in der Web Beans Referenzdokumentation sogar auf deutsch nachgelesen werden.

Namen und Scope für Zugriff mit EL
Das zweite Beispiel soll zeigen wie einfach es in Zukunft werden soll eine Business Komponente der View via EL (Expression Language) zur Verfügung zu stellen. Dazu wird der unserer Business Komponente (Klasse) Printer einfach die Annotation @Named hinzugefügt und somit dieser Java Bean ein Name Vergeben (siehe auch Referenzdokumentation):

@Named("printer")
public class Printer {

  @Informal Greeting greeting;

  public void greet() {
    System.out.println( greeting.greet("Markus") );
  }
}

In der View kann ab sofort über den Namen “printer” darauf zugegriffen werden:

<h:commandButton value="Say Hello" action="#{printer.greet}"/>

Jetzt kann man der Business Komponente noch einen Scope (Geltungsbereich) geben. Bereits vorhandene Scopes sind @RequestScoped, @SessionScoped, @ApplicationScoped und @ConversationScoped. In diesem Beispiel wird @RequestScoped verwendet. Somit steht eine Instanz dieser Komponente einen kompletten Request lang zur Verfügung.
Um die Begrüßung etwas persönlicher zu machen kann man nun noch den Namen für die Begrüßung über die View angeben und direkt in der Business Komponente vie EL setzen. Dazu wird noch ein Attribut name benötigt:

@RequestScoped
@Named("printer")
public class Printer {

  @Informal Greeting greeting;
  private String name;

  public void greet() {
    System.out.println( greeting.greet(name) );
  }

  public void setName(String name) { this.name=name; }
  public String getName() { return name; }
}

Hier die dazugehörige angepasste View:

<h:form>
  <h:inputText value="#{printer.name}"/>
  <h:commandButton value="Say Hello" action="#{printer.greet}"/>
</h:form>

Die hier aufgezeigten zwei Beispiele zeigen nur einen kleinen Teil des JSR 299. Aber gerade die einfache Annotation @Named und die verfügbaren Scopes ist ein riesen Schritt in die Vereinfachung der Entwicklung von Webanwendungen. Wie schon erwähnt sind diese Erneuerungen in JEE 6 heute in JEE 5 durch Seam auch schon möglich.

Wer mehr über den JSR 299 wissen möchte sollte sich die Präsentation von Gavin King, das JSR 299 selbst, die Referenzdokumentation sowie die Referenzimplementierung mit seinen Beispielen mal genauer anschauen. Alternativ kann man sich natürlich auch einfach mit JBoss Seam beschäftigen, welches unter anderem die Basis für JSR 299 ist.

Tags: , , , ,

Wenn du Fragen oder Anregungen zum Post hast, dann hinterlasse doch ein Kommentar oder wenn du weiterhin Artikel von Javathreads lesen möchtest, dann abonniere den RSS Feed und sehe direkt in deinem Feed Reader die nächsten Artikel.

Ähnliche Artikel, die dich interessieren könnten:
Kommentare

Mal wieder ein interessanter Beitrag, danke :-) !

[...] kleine Einführung in Web Beans und somit in JEE 6 haben möchte sollte sich auch die Präsentation von Gavin King über die Web Beans anschauen. In diesem Artikel habe ich auch noch ein kleines Beispiel gepostet. Lesezeichen [...]

Müßte die zweite Klasse nicht lauten:

@Formal
public class FormalGreeting extends Greeting {
public String greet(String name) {
return “hello ” + name;
}
}

[...] der restiche Artikel hier zu [...]

Hinterlasse ein Kommentar