CodeGym /Java-Blog /Random-DE /Frühling für faule Leute. Grundlagen, grundlegende Konzep...
John Squirrels
Level 41
San Francisco

Frühling für faule Leute. Grundlagen, grundlegende Konzepte und Beispiele mit Code. Teil 1

Veröffentlicht in der Gruppe Random-DE
Frühling für faule Leute. Grundlagen, grundlegende Konzepte und Beispiele mit Code.  Teil 1 - 1In diesem Artikel werde ich Ihnen nicht sagen, wie Sie mit meinem Code in 5 Minuten ein funktionierendes Spring-Projekt zum Laufen bringen. Ich werde nur die Grundlagen schreiben – Dinge, die Sie möglicherweise nicht kennen und trotzdem ein Projekt erstellen. Aber in diesem Artikel werden Sie immer noch nicht verstehen, was passiert und, was noch wichtiger ist, warum.

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. Frühling für faule Leute. Grundlagen, grundlegende Konzepte und Beispiele mit Code.  Teil 1 - 2

https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/
Abbildung 2.1. Überblick über das Spring Framework

Wie Sie sehen, ist Spring modular aufgebaut. Dadurch können wir nur die Module anschließen, die wir für unsere Anwendung benötigen, und nicht diejenigen, die wir offensichtlich nicht verwenden. Soweit ich weiß, war es dieser Ansatz, der es Spring ermöglichte, seinen damaligen Konkurrenten (EJB) zu übertreffen und die Führung zu übernehmen. Anwendungen, die EJB verwenden , schleppten viele Abhängigkeiten mit sich und erwiesen sich daher als träge und langsam. Das Bild zeigt, dass das Spring Framework aus mehreren Modulen besteht:
  • Datenzugriff
  • Netz
  • Kern
  • und mehr
Heute machen wir uns mit einigen Konzepten des Hauptmoduls vertraut: Beans, Kontext und andere. Wie Sie vielleicht schon vermutet haben, enthält das Datenzugriffsmodul Tools für die Arbeit mit Daten (hauptsächlich Datenbanken), und das Webmodul dient der Arbeit in einem Netzwerk (einschließlich der Erstellung von Webanwendungen, die später besprochen werden). Darüber hinaus gibt es eine umfassende Infrastruktur, die Spring unterstützt: Viele weitere Projekte, die nicht offiziell im Framework selbst enthalten sind, sich aber nahtlos in Ihr Spring-Projekt integrieren (z. B. Spring Security, auf das ich hoffentlich auch eingehen möchte). Authentifizierung eines Benutzers auf einer Website).

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 SecurityModule 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:
  1. XML-Konfigurationsdateien
  2. Java-basierte Konfiguration
  3. automatische Konfiguration
Die Entwickler von Spring priorisieren sie in dieser Reihenfolge:
  • 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.
Mit Spring können wir diese Methoden auch kombinieren. Lassen Sie Spring beispielsweise alles konfigurieren, was automatisch konfiguriert werden kann, verwenden Sie die Java-basierte Konfiguration überall dort, wo Sie spezielle Parameter benötigen, und verwenden Sie XML für alle Legacy-Konfigurationen. Das alles erweist sich als recht flexibel. Wenn jedoch alles automatisch konfiguriert werden kann, wählen Sie diese Option. Ich werde nur die automatische Konfiguration und die Java-basierte Konfiguration berücksichtigen. XML-Konfigurationen werden in fast jedem Spring-Beispiel im Internet verwendet. Darüber hinaus sollten Sie, sobald Sie verstanden haben, wie die Java-basierte Konfiguration funktioniert, kein Problem damit haben, eine XML-Datei zu lesen, die dasselbe tut. Die automatische Konfiguration wird verwendet, wenn wir mit Objekten von Klassen arbeiten müssen, die wir geschrieben haben. Wenn die Erstellung eines unserer Objekte eine ganz bestimmte Logik erfordert, oder wenn wir nicht in der Lage sind, eine Klasse mit der für die automatische Konfiguration erforderlichen Annotation zu erstellen, können wir die Java-basierte Konfiguration verwenden, um das zu tun, was getan werden muss. ImIm nächsten Teil erstellen wir ein Maven-Projekt, verbinden einige der wichtigsten Spring-Module und erstellen unsere ersten Beans.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION