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

Qualifier

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Qualifier dienen dazu, mehrere unterschiedliche Arten von Klassen und Instanzen innerhalb eines Projekts eindeutig voneinander zu unterscheiden und dadurch Fehler zu vermeiden.

Transkript

Ist es Ihnen auch schon passiert? Sie haben eine Variable vom Typ einer Basisklasse definiert und wollten dieser Variablen vom Typ der Basisklasse per CDI eine abgeleitete Instanz zuweisen? Das wird nicht funktionieren, denn Basisklasse und abgeleitete Instanz sind aus Sicht der Basisklasse nicht wirklich eindeutig voneinander unterscheidbar. Das ist die Stelle, an der Qualifier ins Spiel kommen, denn Qualifier erlauben es uns, Beans eindeutig voneinander unterscheidbar zu machen. Qualifier selbst sind Annotationen, die ihrerseits wieder mit der "@Qualifier-Annotation" versehen sind. Qualifier können auf Ebene von Klassen, auf Ebene von Methoden, auf Ebene von Konstruktoren und auf Ebene von Feldern definiert werden. Auf Klassenebene spezialisieren sie eine Klasse und auf Ebene von Konstruktoren, Methoden und Feldern sorgen sie dafür, dass die entsprechende Spezialisierung per CDI automatisch zugewiesen wird. Damit löst sich das Problem, was ich am Eingang dieses Videos beschrieben habe. Schauen wir uns einfach einmal an, wie wir einen Qualifier definieren und verwenden können. Sie sehen hier die Klasse "KontakteManager". Diese Klasse "KontakteManager" verfügt über eine private Member-Variable vom Typ "KontakteProvider". Im Konstruktor soll eine Zuweisung geschehen per CDI. Allerdings gibt es ein Problem. Die Auflösung ist nicht eindeutig möglich, denn es gibt zwei Implementierungen des KontakteProviders in diesem Projekt. Einmal die Basisklasse und einmal eine abgeleitete Testimplementierung. Nun könnte man sagen, wir schließen die Testimplementierung oder die Basisklasse, je nachdem, was man benötigt, per Filter in der "beans.xml" aus. Oder wir verwenden die Vetoed-Annotation. Aber oftmals ist das nicht eindeutig genug bzw. viel zu grob vom Ansatz her. Aus diesem Grund werden wir nun einen Qualifier definieren und dieser Qualifier ist letztlich nichts anderes als eine Annotation. Wir führen deswegen einen Rechtsklick auf ein Package aus und wählen "New" "Annotation" aus. Wir geben dem Qualifier einen Namen, in dem Fall heißt er "Test". Damit der Qualifier funktionieren kann, müssen wir den Qualifier als Qualifier kennzeichnen. Das machen wir mit Hilfe der Qualifier-Annotation. Nun müssen wir noch eine Retention-Annotation hinzufügen, die regelt, wie ist dieser Qualifier für Java sichtbar, nämlich zur Laufzeit. Ebenfalls müssen wir, das ist bei jeder Annotation nötig, sagen, wo soll diese Annotation verwendet werden können. Das machen wir, indem wir die Target-Annotation verwenden und dadrin einen Array definieren, wo wir mit Hilfe von verschiedenen ElementType-Angaben festlegen, dass so ein Qualifier auf Ebene von Typen, also Klassen, auf Ebene von Konstruktoren, auf Ebene von Feldern und auf Ebene von Methoden verwendbar sein soll. Damit ist der Qualifier bereits fertig definiert, mehr ist hier nicht nötig. Nun kann dieser Qualifier an geeigneter Stelle eingesetzt werden und das wird auf Ebene des TestKontakteProviders sein. Nicht nur, weil die Klasse auch schon mit "Test" beginnt, sondern weil Sie eben eine Spezialisierung darstellt. Um den Qualifier hier einzusetzen, deklariere ich ihn einfach oberhalb der Klasse. Damit ist dieser Qualifier dieser Instanz zugewiesen und das Problem im Manager hat sich bereits erledigt. Hier gibt es jetzt kein Problem mehr bei dieser Inject-Anweisung. Der Grund dafür ist, dass hier ein Standard-Qualifier jetzt verwendet wird, den ich nicht spezifisch definiert habe. Darüber reden wir gleich. Wenn ich jetzt möchte, dass die spezifische TestKontakteProvider- Implementierung hier benutzt wird, dann mache ich das oder stelle das klar, indem ich den entsprechenden Qualifier hier mit hinzufüge. Nunmehr wird in dem Kontaktemanager immer nur die Testimplementierung injiziert werden. Neben meinem selbstdefinierten Qualifier gibt es im Java-EE-CDI-Umfeld mehrere vordefinierte Qualifier. Diese sollte man kennen. Der Standard-Qualifier, der implizit auf jeder Bean vorhanden ist, ist der Default-Qualfifier. Definieren ich einen eigenen Qualifier, ist dieser Standard-Qualifier nicht mehr vorhanden. Das war der Grund, warum die Auflösung im Konstruktor der Klasse vorhin dann plötzlich funktioniert hatte, nachdem ich die abgeleitete Klasse mit dem Test-Qualifier versehen hatte. Ebenfalls gibt es den Any-Qualifier. Dieser ist implizit auf jeder Bean vorhanden. Und der ist auch immer noch vorhanden, wenn die Bean einen eigenen Qualifier definiert. Es gibt ebenfalls den Named-Qualifier. Dieser Named-Qualifier wird verwendet, wenn wir die "Expression Language" einsetzen, weil damit wird angesagt, dass die entsprechende Bean per Expression Language sichtbar und ansprechbar ist. Und zuletzt existiert noch der New-Qualifier. Dieser sollte allerdings, auch wenn der Name etwas anderes aussagt, nicht mehr verwendet werden, denn er ist veraltet und nicht mehr neu. Es gibt andere Mechanismen, wie wir die Funktionalität, die der New-Qualifier bereitstellte, nämlich bei jedem Aufruf eine neue Instanz zu erzeugen, umsetzen können. In diesem Video haben wir ein häufig auftretendes Problem im CDI-Umfeld geklärt. Nämlich, wie man Klassen eindeutig voneinander unterscheidbar machen kann. Dies kann mit Hilfe von Qualifiern geschehen. Wir haben geklärt, wie wir Qualifier deklarieren können, wie wir sie nutzen können und wir haben über die vordefinierten Qualifier gesprochen. Nun liegt es an Ihnen, dieses Wissen sinnvoll einzusetzen.

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!