Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Spring Framework Grundkurs

Dependency Injection mit Spring

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Dependency Injection erleichtert die Erzeugung von Klasseninstanzen mit vielen Abhängigkeiten und macht daraus einen einmaligen Konfigurationsprozess. Spring macht das anhand von XML-Konfiguration möglich.

Transkript

Mit Hilfe der Dependency Injection und des Spring Frameworks können Sie Ihr eigenes Programmiervorgehen zukünftig deutlich einfacher gestalten. Wie Sie nun Gebrauch von diesen Möglichkeiten machen erfahren Sie im Laufe dieses Videos. Prinzipiell gilt es erstmals zu verstehen, was Dependency Injection im Kontext des Spring Framework bedeutet. Es ist also die Art und Weise, wie man Objekte von einem Container aus in Zusammenhang bringt. Da Objekte oft Anhängigkeiten zueinander haben, sorgt also die Dependency Injection dafür, dass diese Abhängigkeiten korrekt aufgelöst werden. Oftmals spricht man auch von Inversion of Control. Das liegt daran, dass man die Aufgabe der Erzeugung von Objekten an eine externe Instanz übergibt. Dadurch hat man einen sogenannten Kontrollverlust. Der Container ist also derjenige, der diese Abhängigkeiten verwaltet. Des Weiteren initialisiert er auch die Objekte, so dass sie genutzt werden können. Er verlinkt sie miteinander und damit ist der Container für den gesamten Injektionsprozess zuständig. Diesen Vorgang nutzt man auch oft mit dem in Hollywood typischen Ausspruch "Don’t call me, I will call you." Um das Ganze noch einmal visuell zu demonstrieren. Es gibt den Spring Container. Dieser erzeugt zur Laufzeit dann verschiedene Objekte, die man auch oftmals als Bean bezeichnet. Und genau diese Objekte haben oftmals auch Objekte, die außerhalb des Spring Containers liegen z. B. Instanzen eines Strings. Im Rahmen des Initialisierungsprozesses sorgt der Spring Container nun also dafür, dass die Objekte bzw. Beans mit den Objekten, die einerseits außerhalb des Containers liegen verbunden werden und andererseits auch mit den Objekten, die innerhalb des Containers liegen. All das passiert vollkommen automatisch und anhand von Deklarationen. Betrachtet man nun also die Beispiel- Bean-Datenbank hat diese beispielsweise einen jdbc-String der außerhalb des Spring Containers liegt. Der Spring Container verlinkt beide Objekte bei der Initialisierung und sorgt weiterhin dafür, dass die Datenbank eine DataSource hat, die wiederum auch eine andere Bean im Container ist. Damit eine Klasse nun eine Bean sein kann, muss sie verschiedene Dinge erfüllen. Zunächst einmal handelt es sich bei einer Bean immer konkret um ein Objekt. Dieses Objekt wird im Regelfall immer anhand einer Konfiguration fremderzeugt. Fremderzeugt heißt in diesem Fall z. B. dass der Container diese Bean Eine Bean unterliegt auch unterschiedlichen Lebenszeiten und verschiedenen Events, die innerhalb ihrer Lebenszeit passieren, z. B. wird sie einerseits initialisiert und mit den jeweiligen Abhängigkeiten versorgt und andererseits wird auch wieder zerstört wenn der Kontext beendet wird. Damit eine Klasse eine Bean werden kann, muss sie bestimmte Eigenschaften erfüllen. Zunächst einmal ist es wichtig, einen öffentlichen und argumentlosen Konstruktor zu haben, denn sonst ist es für den Container nicht möglich eine Instanz zu erstellen. Des Weiteren sollte sie im Regelfall serialisierbar sein, damit sie ausgetauscht werden kann. Das ist allerdings eine Eigenschaft, die nicht zwangsläufig für jede Bean gelten muss. Damit die Bean mit den jeweiligen Abhängigkeiten versorgt werden kann, ist es im Regelfall notwendig öffentliche Setter und Getter zu haben. Damit Spring weiß, dass es sich um eine Bean handelt, ist es notwendig, Spring darauf hinzuweisen mithilfe einer sogenannten Konfigurationsdatei. Im Regelfall handelt es sich dabei um eine XML-Datei. Diese beinhaltet die Information "beans". Wichtig hier ist, dass die jeweiligen Namensbereiche des XML-Files deklariert sind. Hat man nun eine Klasse wie beispielsweise HelloWorld, ist es möglich mit der XML-Anweisung "bean" der Vergabe einer bestimmten ID und den jeweiligen Klassenreferenz-Link eine Bean-Instanz dieser Klasse zu erstellen. Um die Abhängigkeit von Message umzusetzen gibt es die Möglichkeit die property zu deklarieren. Bei der Initialisierung wird Spring nun also automatisch die Nachricht "Hello, World!" in die Instanz von HelloWorld übertragen. Ruft man also die Bean vom Applikationskontext ab und nutzt die Funktionalität, ist der jeweilige String bereits initialisiert. Ein wenig komplizierter ist das Ganze, wenn es sich um Klassen handelt, die initialisiert werden müssen. In diesem Fall gibt es ein Dreieck, das abhängig ist von einem Punkt. Um diesen Punkt aufzubauen, würde man zunächst einmal wieder die Namespaces deklarieren hätte dann entsprechend eine Klasse "Punkt". Diese wird auch über eine Bean initialisiert. Das Vorgehen ähnlich wie gerade eben. Und um diesen Punkt nun für das Dreieck zu nutzen, würde man anhand der Referenz die Verbindung herstellen. Damit befinden sich also beide Instanzen innerhalb des Spring Containers. Durch die simple Abfrage getBean("dreieck") wird nun das vollständig initialisierte Dreieck abgerufen. Alternativ ist es auch möglich, die Bean direkt zu deklarieren, also ohne die Referenz. In diesem Beispiel deklariert man also das Dreieck und man deklariert die Bean selbst innerhalb der property. Dadurch erspart man sich einerseits eben den Ref-Tag. Der kann ersetzt werden. Das Ganze führt allerdings zu einer unglaublich tiefen Verschachtelung und je nach Anwendungszweck sollte man sich überlegen, ob man genau diese Möglichkeiten nutzen möchte. Das Ganze möchte ich Ihnen nun anhand eines Beispiels visualisieren. Zunächst einmal sollte also sichergestellt sein, dass die korrekten Abhängigkeiten eingebunden sind. Die richtige Abhängigkeit ist hier der Spring Kontext, der hauptsächlich für die Dependency Injektion zuständig ist. Die gesamte Konfiguration der Beans befindet sich in der XML-Datei. Dort gibt es eine Bean mit dem Namen "A3", die aus dem Auto erstellt wird. Weiterhin wird ein property definiert, dass vier Reifen erzeugt über direkte Bean-Einbindung innerhalb des properties. Und dann gibt es noch eine Referenz auf den "A3_motor" der entsprechend hier initialisiert wird. Über "autowire" besorgt er sich seine Abhängigkeiten. Und der Kraftstoff wird entsprechend hier unten initialisiert, mit "prototype", so dass immer ein neuer Kraftstoff entsteht. Um sich also nun einen solchen "A3" erstellen zu können, ist das Vorgehen relativ einfach. Man lädt den Applikationskontext und die Konfigurationsdatei dazu, lässt sich die Bean "A3" erzeugen und gibt diese, in diesem Fall auf der Konsole aus. Bei der Ausführung wird nun automatisch das Auto erzeugt, das entsprechend die Abhängigkeiten beinhaltet. Die Besonderheit anhand der XML-Konfiguration ist nun, dass in den Beans selbst nichts weiter mit Annotationen definiert ist. Alle Abhängigkeiten werden anhand der XML-Datei aufgelöst. Sie haben nun gesehen, wie einfach es durch das Zusammenspiel von Dependency Injection und Spring ist, jetzt selbst komplexeste Objekte auf einfachste Art und Weise zu erzeugen.

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!