
Was ist das Spring Framework?
Das Spring Framework, oder einfach Spring, ist eines der beliebtesten Frameworks zum Erstellen von Webanwendungen in Java. Ein Framework ist wie eine Bibliothek (vielleicht kennen Sie diesen Begriff besser), aber es gibt etwas zu beachten. Grob gesagt erstellen Sie bei der Verwendung einer Bibliothek einfach Instanzen der darin enthaltenen Klassen, rufen die benötigten Methoden auf und erhalten so das gewünschte Ergebnis. Mit anderen Worten, dies ist ein zwingenderer Ansatz: In Ihrem Programm geben Sie explizit den genauen Zeitpunkt an, zu dem Sie welches Objekt erstellen müssen, wann Sie welche bestimmte Methode aufrufen müssen usw. Bei Frameworks sieht die Sache etwas anders aus. Sie schreiben einfach einige eigene Klassen und schreiben darin etwas Logik, aber dann erstellt das Framework selbst Instanzen Ihrer Klassen und ruft deren Methoden auf. Ihre Klassen implementieren normalerweise einige Schnittstellen des Frameworks oder erben einige seiner Klassen und stellen Ihnen so einige Funktionen zur Verfügung, die bereits für Sie geschrieben wurden. Dies ist jedoch nicht immer der Fall. Spring versucht beispielsweise so weit wie möglich, eine solche enge Kopplung zu vermeiden (bei der Ihre Klassen direkt von Klassen/Schnittstellen im Framework abhängen). Um dies zu erreichen, werden Anmerkungen verwendet. Wir werden später darauf zurückkommen. Aber es ist wichtig zu verstehen, dass Spring nur eine Sammlung von Klassen und Schnittstellen ist, die Ihnen zur Verfügung stehen :) Ich möchte auch gleich anmerken, dass Spring nicht nur für Webanwendungen, sondern auch für die gängigsten Konsolenprogramme verwendet werden kann die uns allen so vertraut sind. Und wir werden heute sogar eines davon schreiben. Dadurch stehen Ihnen einige Funktionen zur Verfügung, die bereits für Sie geschrieben wurden. Dies ist jedoch nicht immer der Fall. Spring versucht beispielsweise so weit wie möglich, eine solche enge Kopplung zu vermeiden (bei der Ihre Klassen direkt von Klassen/Schnittstellen im Framework abhängen). Um dies zu erreichen, werden Anmerkungen verwendet. Wir werden später darauf zurückkommen. Aber es ist wichtig zu verstehen, dass Spring nur eine Sammlung von Klassen und Schnittstellen ist, die Ihnen zur Verfügung stehen :) Ich möchte auch gleich anmerken, dass Spring nicht nur für Webanwendungen, sondern auch für die gängigsten Konsolenprogramme verwendet werden kann die uns allen so vertraut sind. Und wir werden heute sogar eines davon schreiben. Dadurch stehen Ihnen einige Funktionen zur Verfügung, die bereits für Sie geschrieben wurden. Dies ist jedoch nicht immer der Fall. Spring versucht beispielsweise so weit wie möglich, eine solche enge Kopplung zu vermeiden (bei der Ihre Klassen direkt von Klassen/Schnittstellen im Framework abhängen). Um dies zu erreichen, werden Anmerkungen verwendet. Wir werden später darauf zurückkommen. Aber es ist wichtig zu verstehen, dass Spring nur eine Sammlung von Klassen und Schnittstellen ist, die Ihnen zur Verfügung stehen :) Ich möchte auch gleich anmerken, dass Spring nicht nur für Webanwendungen, sondern auch für die gängigsten Konsolenprogramme verwendet werden kann die uns allen so vertraut sind. Und wir werden heute sogar eines davon schreiben. Spring versucht so weit wie möglich, eine solche enge Kopplung zu vermeiden (bei der Ihre Klassen direkt von Klassen/Schnittstellen im Framework abhängen). Um dies zu erreichen, werden Anmerkungen verwendet. Wir werden später darauf zurückkommen. Aber es ist wichtig zu verstehen, dass Spring nur eine Sammlung von Klassen und Schnittstellen ist, die Ihnen zur Verfügung stehen :) Ich möchte auch gleich anmerken, dass Spring nicht nur für Webanwendungen, sondern auch für die gängigsten Konsolenprogramme verwendet werden kann die uns allen so vertraut sind. Und wir werden heute sogar eines davon schreiben. Spring versucht so weit wie möglich, eine solche enge Kopplung zu vermeiden (bei der Ihre Klassen direkt von Klassen/Schnittstellen im Framework abhängen). Um dies zu erreichen, werden Anmerkungen verwendet. Wir werden später darauf zurückkommen. Aber es ist wichtig zu verstehen, dass Spring nur eine Sammlung von Klassen und Schnittstellen ist, die Ihnen zur Verfügung stehen :) Ich möchte auch gleich anmerken, dass Spring nicht nur für Webanwendungen, sondern auch für die gängigsten Konsolenprogramme verwendet werden kann die uns allen so vertraut sind. Und wir werden heute sogar eines davon schreiben. ) Ich möchte auch gleich darauf hinweisen, dass Spring nicht nur für Webanwendungen verwendet werden kann, sondern auch für die gängigsten Konsolenprogramme, die uns allen so vertraut sind. Und wir werden heute sogar eines davon schreiben. ) Ich möchte auch gleich darauf hinweisen, dass Spring nicht nur für Webanwendungen verwendet werden kann, sondern auch für die gängigsten Konsolenprogramme, die uns allen so vertraut sind. Und wir werden heute sogar eines davon schreiben.Struktur
Aber Spring ist nicht nur ein bestimmtes Framework. Vielmehr handelt es sich um einen gebräuchlichen Namen, der sich auf mehrere kleine Frameworks bezieht, von denen jedes seine eigene Art von Arbeit erledigt.
https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/
Abbildung 2.1. Überblick über das Spring Framework
- Datenzugriff
- Netz
- Kern
- und mehr
Warum verfügt Java über das Spring Framework?
Nun, abgesehen von der Tatsache, dass es modisch, elegant und frisch ist, kann ich jetzt schon sagen, dass Sie verstehen werden, dass es alle Arten von Arbeit gibt, die Sie nicht mehr haben, sobald Sie sich mit Spring auch nur ein wenig auskennen zu tun hat und wie viel Arbeit der Frühling auf sich nimmt. Sie können ein paar Dutzend Zeilen mit Konfigurationseinstellungen schreiben und ein paar Klassen schreiben, und am Ende haben Sie ein funktionierendes Projekt. Aber sobald Sie sich fragen, wie viel Zeug unter der Haube steckt, wie viel Arbeit geleistet wird und wie viel Code Sie schreiben müssten, wenn Sie dasselbe Projekt auf Basis einfacher Servlets oder Sockets und reinem Java implementieren würden, Dir werden die Haare zu Berge stehen :) Der Frühling wird sogar als eine Art Magie beschrieben. Das erlebt man, wenn man sieht, dass alles funktioniert, Aber man hat auch eine ungefähre Vorstellung davon, wie und wie viel Arbeit hinter den Kulissen passiert – es scheint also, dass da wirklich eine Art Magie in Aktion ist :) Es ist einfacher, es Magie zu nennen, als zu erklären, wie alles miteinander verbunden ist. :) Das zweite Argument für das Studium von Spring ist, dass etwa 90 % der offenen Stellen für Nachwuchsentwickler (basierend auf meinen persönlichen Beobachtungen) entweder Kenntnisse oder zumindest eine allgemeine Vorstellung davon erfordern, was Spring istData
, Web MVC
, und Security
Module bieten erfahrenen Entwicklern :) Aber heute geht es nur um die Grundlagen.
DI/IoC
Wenn Sie jemals versucht haben, etwas über Spring zu lesen, dann sind Sie wahrscheinlich als Erstes auf diese Akronyme gestoßen: DI/IoC. Jetzt empfehle ich Ihnen dringend, eine Pause von diesem Artikel einzulegen und diesen DZone-Artikel zu lesen ! IoC steht für Inversion of Control. Ich habe dies bereits am Rande erwähnt, als ich geschrieben habe, dass Sie bei der Verwendung einer Bibliothek selbst in Ihrem Code angeben müssen, welche Methode Sie für welches Objekt aufrufen möchten. Die Verwendung eines Frameworks bedeutet jedoch im Allgemeinen, dass das Framework Ihren Code zum richtigen Zeitpunkt aufruft. Mit anderen Worten: Im letzteren Fall verwalten Sie den Prozess der Ausführung des Codes/Programms nicht mehr – das Framework erledigt dies für Sie. Sie haben die Kontrolle an das Framework übergeben (Kontrollumkehr). DI steht für Dependency Injection. Bei der Abhängigkeitsinjektion erstellen Sie keine Cat-Objekte in der Hauptmethode und übergeben sie dann an Ihre Methoden. Stattdessen werden sie vom Spring Framework für Sie erstellt. Sie sagen einfach etwas wie „Ich möchte hier eine Katze haben“ und das Framework übergibt Ihnen in Ihrer Methode eine. Wir werden diese Abkürzung in zukünftigen Artikeln sehen.Bohnen und Kontext
Eines der Schlüsselkonzepte im Frühling ist eine Bohne. Tatsächlich ist dies nur ein Objekt einer Klasse. Angenommen, wir haben ein Programm, das drei Objekte benötigt: eine Katze, einen Hund und einen Papagei. Und wir haben eine Menge Klassen mit einer Menge Methoden. Manchmal brauchen wir eine Katze für eine Methode, manchmal brauchen wir einen Hund für eine andere Methode und manchmal brauchen unsere Methoden sowohl eine Katze als auch einen Papagei (zum Beispiel die Methode zum Füttern der Katze, haha). Für noch andere Methoden werden alle drei Objekte benötigt. Ja, wir könnten diese drei Objekte zuerst in der Hauptmethode erstellen und sie dann an unsere Klassen übergeben und sie dann innerhalb dieser Klassen an die entsprechenden Methoden übergeben ... Und so weiter im gesamten Programm. Aber wenn wir auch annehmen, dass wir gelegentlich die Liste der Eingabeparameter für unsere Methoden ändern möchten (z. B. Wenn wir beschließen, etwas umzuschreiben oder neue Funktionalität hinzuzufügen), müssen wir einige Änderungen am Code vornehmen. Und nun stellen Sie sich vor, dass wir nicht 3, sondern 300 solcher Objekte haben. Eine Alternative wäre, alle unsere Objekte in einer Liste zusammenzufassen (List<Object>
), übergeben Sie es an jede Methode und rufen Sie dann das erforderliche Objekt innerhalb der Methoden ab. Aber was passiert, wenn während der Ausführung des Programms ein Objekt zu dieser Liste hinzugefügt wird, oder schlimmer noch, was passiert, wenn eines gelöscht wird? Dies kann jede Methode kaputt machen, bei der wir einen Index verwenden, um Objekte aus der Liste abzurufen. Um dieses Problem zu vermeiden, entscheiden wir uns, unsere Objekte nicht in einer Liste, sondern in einer Karte zu speichern, wobei der Schlüssel der Name des Objekts und der Wert das Objekt selbst ist. Dadurch können wir die benötigten Objekte abrufen, indem wir einfach ihren Namen verwenden, z. B. get("parrot"), und als Antwort erhalten wir das Papageienobjekt. Oder der Schlüssel könnte die Klasse des Objekts sein und der Wert könnte das Objekt selbst sein. In diesem Fall können wir nicht den Namen des Objekts angeben, sondern nur die Klasse des benötigten Objekts angeben. Das ist auch praktisch. Oder wir könnten sogar eine Art Wrapper für die Karte schreiben, in dem einige Methoden Objekte anhand ihres Namens und andere Methoden Objekte anhand ihrer Klasse abrufen. Was wir hier erreicht haben, nennt man einAnwendungskontext im Spring Framework. Ein Kontext ist eine Sammlung von Beans (Objekten). Wir greifen auf einen Kontext zu, um die benötigte Bean (das Objekt) anhand ihres Namens, ihres Typs oder auf andere Weise abzurufen. Darüber hinaus können wir Spring selbst bitten, in seinem eigenen Kontext nach der benötigten Bean zu suchen und sie an unsere Methode zu übergeben. Angenommen, wir hätten eine Methode wie diese:
public void doSomething(Cat cat) {
...
}
Als Spring diese Methode aufrief, nahm es unser Katzenobjekt aus seinem Kontext und übergab es an die Methode. Aber jetzt haben wir beschlossen, dass unsere Methode neben einer Katze auch einen Papagei braucht. Mit Spring könnte nichts einfacher sein! Wir schreiben einfach:
public void doSomething(Cat cat, Parrot parrot) {
...
}
Wenn Spring nun unsere Methode aufruft, versteht es die Notwendigkeit, eine Katze und einen Papagei zu übergeben, also geht es zu seinem Kontext, ruft diese beiden Objekte ab und übergibt sie an unsere Methode. Indem wir die Kontrolle an Spring übertragen, übertragen wir auch die Verantwortung für die Erstellung von Objekten und deren Übergabe an unsere Methoden, die Spring aufrufen wird. Dies wirft die Frage auf: Woher weiß Spring, welche Objekte (Beans) erstellt werden müssen?
Möglichkeiten zum Konfigurieren einer Anwendung
Es gibt drei Hauptmethoden zum Konfigurieren einer Anwendung , d. h. Möglichkeiten, Spring genau mitzuteilen, welche Objekte wir benötigen:- XML-Konfigurationsdateien
- Java-basierte Konfiguration
- automatische Konfiguration
- Die Methode mit der höchsten Priorität, die bevorzugt werden sollte, ist die automatische Konfiguration
- Wenn die automatische Konfiguration nicht zur korrekten Konfiguration aller möglichen Beans verwendet werden kann, verwenden Sie eine Java-basierte Konfiguration (die das Erstellen von Objekten mit Java-Code umfasst).
- und die Methode mit der niedrigsten Priorität ist die altmodische Methode – die Verwendung von XML-Konfigurationsdateien.
GO TO FULL VERSION