Spring Framework Grundkurs

Introduction und die Mehrfachvererbung

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Die Introduction erlaubt, Prinzipien der Mehrfachvererbung – obwohl von Java selbst nicht unterstützt – in der eigenen Anwendung zu platzieren. Daraus ergeben sich vielfältige Möglichkeiten, die eigene Anwendung zu entwickeln.

Transkript

Merfachvererbung ist ein Konzept, das sich die Entwickler von Java erspart haben. Da dieses Konzept aber einige sehr nützliche Anwendungsfälle hat, haben findige Entwickler das Konzept reimplementiert. Das Resultat ist die sogenannte Introduction, ein Teil des Spring Frameworks und der aspektorientierten Programmierung. Was sich dahinter versteckt möchte ich Ihnen nun zeigen. Die Grundidee ist zunächst das Prinzip der Mehrfachvererbung. Da man aber nicht einfach die Programmiersprache komplett verändern kann, musste man sich dafür eine findige Sache ausdenken, denn eins der Dinge von denen man schon immer mehrfach erben konnte sind Interfaces. Wenn man nun also ein Objekt, das zur Laufzeit existiert, her nimmt und ein Interface auch zur Laufzeit implementiert, so wird Funktionalität, die vorher nicht existent war einfach auf das Objekt hinzugeschaltet. Die Implementierung dieser Funktionalität liegt im Normalfall dann auch außerhalb des ursprünglichen Objektes. Die Frage, die sich nun berechtigterweise stellt: Wozu macht man denn das Ganze? Die Introduction eignet sich vor allem dafür über viele verschiedene Klassen hinweg gleiche Funktionalität zu implementieren und an einem Ort vorzuhalten. Wenn man also nun an dieser zentralen Logik eine Änderung vornimmt, muss man nicht an jeder Stelle diese Änderung vornehmen. Prinzipiell gibt es dann auch zwei Arten von Introduction. Solche, die neues Verhalten hinzufügen, d. h. neue Methoden und Funktionen und solche, die dazu auch noch Variablen hinzufügen, den sogenannten State eines Objektes verändern. Der nächste Schritt ist kennenzulernen, wie eine solche Introduction genutzt werden kann. Es gibt zwei verschiedene Arten eine Introduction zu deklarieren, an der Stelle möchte ich nur die einfache aufzeigen. Man beginnt initial immer damit, eine neue Klasse anzulegen, die idealerweise auch den Titel Introduction trägt. Als nächstes nutzt man die Annotation DeclareParents. Wie der Name schon sagt, erstellen wir nun eine Referenz zu einer neuen Mutterklasse für unser Zielobjekt. Ich möchte also nun erzwingen, dass ein bestimmtes Objekt ein bestimmtes Interface implementiert. Dafür gebe ich zunächst mit dem Parameter "value" die jeweilige Zielklasse in Form eines Strings an. Als nächstes muss ich sicherstellen, dass die Funktionalität, die ich erzwingen möchte auch eine Implementierung hat. Diese Implementierung liegt im Normalfall immer außerhalb des ursprünglichen Objektes. Dafür gebe ich den Parameter defaultImplementation mit einer jeweiligen Referenz zu der Klasse, die die alternative Implementierung enthält an. An der Stelle fehlt immer noch das Interface, das die Implementierung, aus PrinterImpl in diesem Fall, darstellt. Diese deklariert man auf der Klasse direkt. Das bedeutet man gibt eine Variable in der Klasse HWIntroduction in diesem Fall an, die genau das Interface nutzt, das die Implementierung später angeben wird. Lassen Sie mich diesen Vorgang nun noch an einem praktischen Beispiel illustrieren. Um die richtigen Bibliotheken für die Introduction zu nutzen, habe ich in meinem Maven-Projekt Spring- AOP eingebunden, AspectJ und das Basis-Spring-Framework. In der Spring-Konfigurationsdatei ist nun einerseits die Autoproxy von AspectJ aktiviert als auch eine Bean deklariert und der Component-Scan. Wenn man nun die Anwendung ausführt, so wird zunächst der Kontext geladen anhand der Konfigurationsdatei, danach wird der HelloWorldService, also die benannte Bean abgerufen und es wird eine Funktionalität auf diesem HelloWorldService aufgerufen, die getMessage-Funktion. Die getMessage-Funktion gibt nun also einen String-Wert "Hello, World!" zurück. Ansonsten existiert auf dieser Klasse keine weitere Implementierung. Trotzdem bin ich hier später in der Lage diesen HelloWorldService unter einem anderen Interface zu betrachten, dem FancyMessagePrinter. Und ausgehend von diesem kann ich auch eine andere Funktionalität printMessage aufrufen. Man beachte, dass hier besonders auch der Programmfluss sich im Wesentlichen nicht verändert hat. Wenn ich diese Anwendung nun ausführe, erhalte ich sowohl die "Hello, World!"-Abfrage als auch "Hello from Introduction!" Nun gilt es herauszufinden, wo "Hello from Introduction!" herkommt. Wenn ich die HelloWorldIntroduction betrachte, sieht man einerseits, dass es sich um eine Komponente handelt, also vom Spring Framework selbst initialisiert wird als auch, dass die Annotation DeclareParents zur Verfügung steht. Als Zielobjekt wird hier der HelloWorldService spezifiziert und die Standardimplementierung wird von FancyMessagePrinterImplementation geliefert. Das Interface ist der FancyMessagePrinter. Die Erwartung ist also, dass im FancyMessagePrinter die printMessage deklariert ist und dass der FancyMessagePrinterImplementation die entsprechende Implementierung dazu liefert. So sieht man, dass nun "Hello from Introduction!" eigentlich von FancyMessagePrinterImplementation geliefert wird. Eine Sache ist dabei noch zu beachten. In aop-config.xml ist der Wert in proxy-target-class auf "true" gesetzt, was so viel bedeutet, wie in dem Moment, wo der HelloWorldService von Spring initialisiert wird, wird auch sichergestellt, dass der HelloWorldService auch tatsächlich ein HelloWorldService ist. Würde man die Angabe weglassen, könnte man eben nicht mehr den HelloWorldService sondern lediglich nur noch den FancyMessagePrinter. Ich habe Ihnen nun gezeigt, wie schnell und einfach es ist mithilfe des Spring Frameworks Merfachvererbung auch in Java nutzen zu können.

Spring Framework Grundkurs

Steigen sie zum Java-Champion auf und meistern Sie den Umgang mit dem Spring Framework.

2 Std. 4 min (20 Videos)
Derzeit sind keine Feedbacks vorhanden...
Software:
Spring Framework Spring Framework 3
Exklusiv für Abo-Kunden
Erscheinungsdatum:24.09.2014

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!