Die FacesTales-Kolumne

Weniger XML, JSF2 !

Lars Röwekamp und Matthias Weßendorf

Globale Konfiguration vs. Lokalität der Referenzen. Diese Frage stellt sich spätestens seit dem offiziellen Ritterschlag der Java Annotations mit Java SE 5. Somit ist nicht verwunderlich, dass auch die anstehende JSF-2.0-Spezifikation auf den Annotations-Zug aufspringt, um sich so – zumindest teilweise – von den klassischen XML-Monsterkonfigurationen zu lösen.

Schöne neue Welt

Viele neuere Java-Spezifikationen und Frameworks, wie zum Beispiel Google Guice, erlauben mittlerweile eine XML-freie Konfiguration der Anwendung(smodule) auf Basis von speziellen Annotationen. Auch das populäre Spring Framwork sprang mit der Version 2.x auf diesen Zug auf. Das Prinzip ist simpel: „everything in one place“. Verbesserte Wartbarkeit und Lesbarkeit sind das Resultat. Aber auch Annotation müssen gut durchdacht und sinnvoll angewendet werden, um nicht direkt aus der XML-Hölle in die Annotations-Hölle zu geraten.

@nnotations für JSF Managed Beans

Man sieht, Annotations sind „in“. Die neue JSF-Version 2.0 bietet, wie in der letzten Ausgabe besprochen, zahlreiche Neuerungen, die die aktuellen Trends der Java-(EE-)Szene widerspiegeln. Somit auch Annotations für die Verwaltung der ManagedBeans und deren Eigenschaften:

@ManagedBean(name = "userInfo")
@SessionScoped
public class UserSessionInformationBean
{
}

Die Bean kann in der View mit #{userInfo…} angesprochen werden und hat den „session Scope“. Eine Bean ohne Scope-Annotation wird als @RequestScope behandelt. Auf den ersten Blick sieht das recht einfach aus, allerdings darf hinterfragt werden, warum für die Scopes spezielle Annotations eingeführt werden. Ursprünglich war folgender Ansatz geplant:

@ManagedBean(name="mybean", scope="session")

Diese Notation ist wesentlich einfacher zu lesen, da zu viele Annotations auf Dauer den Code auch nicht übersichtlicher machen (Stichwort Annotations-Hölle). Es ist übrigens ebenfalls möglich, eine ManagedBean innerhalb einer Anwendung unter verschiedenen Namen und Scopes mehrfach zur Verfügung zu stellen:

@ManagedBeans({
@ManagedBean(name="myRequestBean",scope="request"),
@ManagedBean(name="mySessionBean",scope="session")
})
public class MyBean 
{
   ...
}
Dependency Injection

JSF hat bereits seit der Version 1.0 einen einfachen Dependency Injection „Container“, der innerhalb des XML-Elements managed-property> zur Geltung kommt. Mit JSF 2 gibt es nun die @ManagedProperty Annotation als Alternative. Darüber hinaus muss eine JSF-Implementierung für ManagedBeans auch die Java EE 5 Dependency Injection Annotations (u.a. @EJB, @Ressource) unterstützen, wie sie in der Servlet-2.5-Spezifikation beschrieben sind.

Ist das alles?

Neben den bisher genannten Annotations sind vor allem noch zwei Bereiche zu nennen, in denen das neue Konzept zum Tragen kommen wird. Zum einen lassen sich die in der letzten Kolumne beschriebenen Listener für System Events via Annotations registrieren. Zum anderen können zukünftig Abhängigkeiten einer Komponente zu Ressourcen, wie zum Beispiel JavaScript-Bibliotheken, durch Annotations angegeben werden. Hier nur ein kleines Beispiel – mehr dazu in einer späteren Kolumne:

@ResourceDependency (name="ajax.js", library="javax.faces", target="head")
public class MyComponent extends UIOutput 
{
   ...
}
Fazit

Für viele wichtige Konfigurationsbereiche bieten die neuen Annotations Hilfe, bzw. verringern unnötige Zeilen an XML-Konfiguration. Da nicht alle Aspekte der aktuellen JSF-Konfiguration über Annotations abgedeckt werden, wird eine XML-Konfiguration nach wie vor notwendig sein. Sollte es innerhalb einer Anwendung zu Konfigurationskonflikten kommen, so sieht die Spezifikation vor, dass der XML-basierten Konfiguration Vorrang zu gewähren ist und sie somit die Annotations „überschreibt“.

Ausblick

Unter weniger XML versteht der ein oder andere auch die Optimierung der Navigationsregeln in JSF. Diese sind zwar nicht so verwuchert wie die von Struts 1.x, allerdings bleibt zu hoffen, dass Ansätze wie diese bei der Finalisierung von JSF 2 berücksichtig werden.

Lars Röwekamp ist Geschäftführer der OpenKnowledge GmbH und berät seit mehr als 10 Jahren Kunden in internationalen Projekten rund um das Thema Enterprise Computing.

Matthias Weßendorf arbeitet für die Oracle Corp. an ADF Faces und Apache Trinidad. Seit 2004 ist er PMC von Apache MyFaces. Matthias hat an verschiedenen internationalen Konferenzen als Redner teilgenommen.

Geschrieben von
Lars Röwekamp und Matthias Weßendorf
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.