Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Java EE 7 Grundkurs

Dekoratoren

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Dekoratoren erlauben es, Geschäftslogiken zu erweitern sowie zusätzliche Funktionalitäten zu integrieren. Deren Definition erfordert nur geringen Aufwand.

Transkript

Sicherlich kennen Sie das Problem: Sie haben eine Geschäfts-Logik-Klasse geschrieben und möchten diese gezielt um Funktionalitäten erweitern. Dies sind aber möglicherweise Funktionalitäten, die eigentlich gar nicht zu den Kernaufgaben dieser Klasse gehören. Das ist die Stelle, an der im CDI-Umfeld Dekoratoren ins Spiel kommen. Kurz zur Unterscheidung: Interzeptoren, über die Sie vielleicht schon gehört haben, sind für verschiedene Klassen zuständig und implementieren sogenannte Cross-Cutting-Concerns. Das heißt Logging, Transaktionssicherheit und ähnliche Sachen. Dekoratoren sind dazu im Gegensatz für einzelne Klassen zuständig. Die einzige Voraussetzung, die dabei erfüllt sein muss, ist, dass die entsprechende Basisklasse ein Interface implementiert. Der decorator, so der englische Fachbegriff, implementiert dieses Interface ebenfalls. Da Interfaces manchmal jedoch sehr, sehr umfangreich sind, ist es nicht nötig, diese Interfaces vollständig zu implementieren. Aus diesem Grund kann und muss dann die decorator-Klasse, denn ein decorator ist nichts anderes, als eine normale Klasse, abstract sein. Wenn man dann das weiß, ist die Implementierung eines Dekoratoren nicht sonderlich schwierig. Ein decorator verfügt über eine decorator-Annotation und verfügt über einen sogenannten injection point, an den die eigentliche Klasse, die also quasi dekoriert werden soll, injiziert wird. Hier sehen wir ein Beispiel. Wir werden dies jedoch auch gleich in einem Projekt umsetzen. Grundsätzlich sind Dekoratoren standardmäßig deaktiviert. Damit wir sie nutzen können, müssen wir den decorator enweder in der Datei beans.xml registrieren, oder wir verwenden die @Priority-Annotation. Dabei ist wichtig, dass auch bei gleicher Priorität, Interzeptoren stets vor Dekoratoren ausgeführt werden. Oder anders ausgedrückt, es ist schlicht nicht möglich, einen decorator zu intercepten und zu unterbrechen. Lassen Sie uns nun einen Blick darauf werfen, wie wir einen Dekoratoren implementieren können. Wie bereits erwähnt, ist die Grundvoraussetzung für den Einsatz eines decorators, dass die entsprechende Klasse, die dekoriert werden soll, also um die Funktionalitäten auf bereits existierenden Methoden erweitern soll, ein Interface implementiert. Wir werden dies anhand der Klasse KontakteManager machen, wir werden zunächst einmal dafür sorgen, dass der KontakteManager tatsächlich ein Interface implementiert. Zu diesem Zweck machen wir einen Rechtsklick in die Klasse und wählen aus dem Kontextmenü die Option Refactor und dort die Option Extract Interface. Wir aktivieren, dass die entsprechende Methode in das Interface übernommen werden soll und definieren das Interface in dem Fall hier als KontakteHandler. Die entsprechende Klasse, beziehungsweise das entsprechende Interface wird nun angelegt. Das reicht uns aus, damit wir in die Lage versetzt sind, dass wir einen decorator schreiben können. Zu diesem Zweck legen wir eine neue Java-Klasse an. Wir nennen sie KontakteDecorator. Diese Klasse ist mit der Annotation @Decorator versehen und implementiert das Interface ebenfalls. Das Interface lautete KontakteHandler. Nun müssen die entsprechenden Methoden implementiert werden. Darum werden wir uns gleich kümmern. Zunächst jedoch müssen wir uns die Instanz, die dekoriert werden soll, injizieren lassen. Wir machen dies in einer privaten Member-Variablen. private KontakteHandler handler; Hier verwenden wir die @Inject-Annotation und fügen ebenfalls den Qualifier @Any hinzu. Ebenfalls benötigen wir den Qualifier @Delegate. Damit ist die Injektion soweit schon fertiggestellt. Nun müssen wir lediglich dafür sorgen, dass die Funktionalität der Basis-Klasse überschrieben wird, beziehungsweise erweitert wird. In unserem Fall werden wir die entsprechende Funktionalität aufrufen. List<String namen = handler.getKontakteNamen(); Und hier einfach einen zusätzlichen Eintrag dieser Liste hinzufügen. namen.add (== DECORATOR <==); Nachdem wir das gemacht haben, geben wir die so geänderte Rückgabe entsprechend selbst zurück. return namen; So, damit ist der decorator fast schon fertig. Das einzige, was wir nun noch benötigen, ist, zum einen dafür zu sorgen, dass dieser decorator aktiviert ist. Das machen wir mit der @Priority-Annotation. Und hier setzen wir die Interceptor-Priority, ich weiß, das ist etwas verwirrend, aber wir nehmen tatsächlich die Interceptor-Priority. APPLICATION + 100 Das bedeutet, das wird zusammen mit Applikations-Handlern und Dekoratoren ausgeführt, ein klein wenig später. Ein kleinerer, niedrigerer Wert würde hier bedeuten, dass dieser decorator eher ausgeführt wird. Uns interessiert jetzt aber diese Priorität gar nicht so extrem. Was wir jetzt noch machen müssen, ist dafür zu sorgen, dass dieser decorator von CDI gefunden werden kann. Das brauchen Sie immer dann, falls in Ihrer beans.xml der Bean-Discovery-Mode auf annotated steht. Das ist meistens der Standardwert. Unser decorator ist fertig. Wir können diesen jetzt in unserer Applikation verwenden. Eigentlich ist gar nichts weiter nötig, denn der decorator wird nun überall dort eingesetzt, wo wir eine Injizierung auf dieses bereits definierte Interface haben. Statt also hier direkt die KontakteManager-Instanz zuzuweisen, die ja das KontakteHandler-Interface implementiert, wird hier an der Stelle ein Proxy erzeugt, der seinerseits den decorator einbindet, der dann seinerseits dafür verantwortlich ist, dass der KontakteManager aufgerufen wird. Sehen wir uns an, ob, und wie das funktioniert. Sie sehen, es gibt hier immer einen zusätzlichen Eintrag. Bei jedem Aufruf des decorators wird nämlich der Liste ein zusätzliches Element hinzugefügt. Damit ist dieser decorator einsatzbereit und kann genutzt werden.

Java EE 7 Grundkurs

Lernen Sie die Grundlagen der Programmierung mit Java EE 7 verstehen und anwenden.

6 Std. 4 min (44 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!