JavaRush /Java-Blog /Random-DE /Der Frühling ist etwas für Faule. Grundlagen, Grundkonzep...
Стас Пасинков
Level 26
Киев

Der Frühling ist etwas für Faule. Grundlagen, Grundkonzepte und Beispiele mit Code. Teil 1

Veröffentlicht in der Gruppe Random-DE
Viele Leute fragten sich, nachdem sie meine Artikel über das Erstellen einer Vorlage für ein Webprojekt und über das Erstellen eines einfachen Webdienstes mithilfe von Servlets gelesen hatten, wann ich über Spring schreiben würde. Ich wollte nicht, ich schlug vor, ein Buch zu lesen (und ich sage immer noch, dass ein Buch besser ist als 10 oder sogar 100 Artikel im Internet). Aber jetzt habe ich beschlossen, dass ich mehr Zeit damit verbringe, verschiedenen Leuten dasselbe zu erklären, als wenn ich mich einmal hinsetzte, einen Artikel schreibe und dann einfach einen Link dazu poste. Ich schreibe also wegen des Links)). Der Frühling ist etwas für Faule.  Grundlagen, Grundkonzepte und Beispiele mit Code.  Teil 1 - 1In diesem Artikel werde ich nicht nach meinem Beispiel schreiben, wie man im Frühling in 5 Minuten ein funktionierendes Projekt erstellt. Ich werde nur über grundlegende Dinge schreiben, ohne deren Kenntnis es sicherlich möglich ist, ein Projekt zu starten, aber was dort passiert und, was noch wichtiger ist, warum, wird nicht klar sein.

Was ist Spring Framework?

Spring Framework , oder einfach Spring , ist eines der beliebtesten Frameworks zum Erstellen von Webanwendungen in Java. Ein Framework ist so etwas wie eine Bibliothek (vielleicht ist Ihnen dieser Begriff vertrauter), aber es gibt einen Punkt. Grob gesagt erstellen Sie mit einer Bibliothek einfach Objekte der darin enthaltenen Klassen, rufen die benötigten Methoden auf und erhalten so das gewünschte Ergebnis. Das heißt, es gibt einen zwingenderen Ansatz: Sie geben in Ihrem Programm klar an, zu welchem ​​Zeitpunkt Sie welches Objekt erstellen müssen, zu welchem ​​Zeitpunkt Sie eine bestimmte Methode aufrufen müssen usw. Bei Frameworks sieht die Sache etwas anders aus. Sie schreiben einfach einige Ihrer eigenen Klassen, schreiben dort einen Teil der Logik und das Framework selbst erstellt Objekte Ihrer Klassen und ruft Methoden für Sie auf. Meistens implementieren Ihre Klassen einige Schnittstellen des Frameworks oder erben einige Klassen davon und erhalten so einen Teil der Funktionalität, die bereits für Sie geschrieben wurde. Aber das muss nicht so sein. Im Frühjahr versuchen sie beispielsweise, sich so weit wie möglich von einer solchen strikten Kopplung zu entfernen (wenn Ihre Klassen direkt von einigen Klassen/Schnittstellen aus diesem Framework abhängen) und verwenden zu diesem Zweck Annotationen. Wir werden später auf diesen Punkt zurückkommen. Aber es ist wichtig zu verstehen, dass Spring nur eine Reihe einiger Klassen und Schnittstellen ist, die bereits für Sie geschrieben wurden :) Ich möchte auch sofort darauf hinweisen, dass Spring nicht nur für Webanwendungen, sondern auch für die gängigsten Konsolen verwendet werden kann Anwendungen, die uns allen so vertraut sind, Programme Und heute werden wir sogar so etwas schreiben.

Struktur

Aber Spring ist kein spezifischer Rahmen. Dies ist eher ein allgemeiner Name für eine Reihe kleiner Frameworks, von denen jedes eine andere Aufgabe erfüllt.
Der Frühling ist etwas für Faule.  Grundlagen, Grundkonzepte und Beispiele mit Code.  Teil 1 - 2
Wie Sie sehen, ist die Feder 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 werden. Soweit ich weiß, war es dieser Ansatz, der Spring dabei half, seinen damaligen Konkurrenten (EJB) zu überholen und die Führung zu übernehmen. Weil Anwendungen, die EJB verwenden , viele Abhängigkeiten mit sich brachten und sie sich im Allgemeinen als langsam und schwerfällig erwiesen. Das Bild zeigt, dass das Spring Framework aus mehreren Modulen besteht:
  • Datenzugriff;
  • Netz;
  • Kern;
  • und andere.
Heute machen wir uns mit einigen Konzepten des Hauptmoduls vertraut, wie zum Beispiel: Beans, Kontext und andere. Wie Sie vielleicht erraten haben, enthält das Datenzugriffsmodul Tools für die Arbeit mit Daten (hauptsächlich Datenbanken), Web – für die Arbeit im Netzwerk (einschließlich der Erstellung von Webanwendungen, auf die später noch eingegangen wird). Darüber hinaus gibt es noch die sogenannte gesamte Spring-Infrastruktur: viele weitere Projekte, die nicht offiziell im Framework selbst enthalten sind, sich aber nahtlos in Ihr Spring-Projekt integrieren (z. B. die gleiche Spring- Sicherheit für das Arbeiten mit Benutzerberechtigung auf der Website, die wir hoffentlich eines Tages auch spüren werden).

Warum Frühling in Java?

Nun, abgesehen davon, dass es modisch, stilvoll und jugendlich ist, kann ich sofort sagen, dass Sie, sobald Sie es auch nur ein wenig beherrschen, verstehen werden, wie viel andere Arbeit Sie jetzt nicht mehr erledigen müssen und wie viel Frühling annimmt. Sie können ein paar Dutzend Konfigurationszeilen schreiben, ein paar Klassen schreiben – und Sie erhalten ein funktionierendes Projekt. Aber sobald Sie darüber nachdenken, wie viel sich „unter der Haube“ befindet, wie viel Arbeit geleistet wird und wie viel Code geschrieben werden müsste, wenn Sie dasselbe Projekt auf nackten Servlets oder auf Sockets und reinem Java durchführen würden - Dir stehen die Haare zu Berge :) Es gibt sogar so einen Ausdruck, wie die „Magie“ des Frühlings. Das ist, wenn man sieht, dass alles funktioniert, man aber ungefähr abschätzt, wie viel dort passieren muss, damit alles funktioniert und wie alles dort funktioniert – dann scheint es, als ob das alles wirklich dank einer Art Magie geschieht)) Es ist einfacher Nennen Sie es alles Magie, anstatt zu erklären, wie alles dort miteinander verbunden ist. lächle data_ web-mvc_ security_ nur das Wesentliche.

DI/IoC

Wenn Sie versucht haben, etwas über Spring zu lesen, dann sind Sie wahrscheinlich als Erstes auf diese Buchstaben gestoßen: DI/IoC . Jetzt empfehle ich Ihnen dringend, eine Pause von diesem Artikel einzulegen und diesen Artikel über Habré zu lesen ! IoC (Inversion of Control) – Umkehrung der Kontrolle. Ich habe dies bereits am Rande erwähnt, als ich schrieb, dass Sie bei der Verwendung einer Bibliothek selbst in Ihren Code schreiben, welche Methode welches Objekts aufgerufen werden soll, und im Fall von Frameworks ruft das Framework meistens den Code auf, den Sie rechts geschrieben haben Moment. Das heißt, hier kontrollieren Sie nicht mehr den Prozess der Ausführung des Codes/Programms, sondern das Framework erledigt dies für Sie. Sie haben ihm die Kontrolle übertragen (Kontrollumkehr). Unter DI versteht man entweder „Abhängigkeitsinversion “ (Abhängigkeitsinversion, d . h. Versuche, keine harten Verbindungen zwischen Ihren Modulen/Klassen herzustellen, bei denen eine Klasse direkt an eine andere gebunden ist) oder „ Abhängigkeitsinjektion “ (Abhängigkeitsinjektion, wenn dies bei Katzenobjekten nicht der Fall ist). die im Wesentlichen von Ihnen erstellt wurden, und dann übergeben Sie sie an Ihre Methoden, und Spring erstellt sie für Sie, und Sie sagen ihm einfach etwas wie „Ich möchte hier eine Katze haben“ und er übergibt sie in Ihrer Methode an Sie. Dem zweiten werden wir in weiteren Artikeln häufiger begegnen.

Bohnen und Kontext

Eines der Schlüsselkonzepte im Frühling ist die Bohne . Im Wesentlichen ist es nur ein Objekt einer Klasse. Nehmen wir an, wir müssen für unser Programm drei Objekte verwenden: eine Katze, einen Hund und einen Papagei. Und wir haben eine Menge Klassen mit einer Menge Methoden, bei denen wir manchmal eine Katze für eine Methode und einen Hund für eine andere Methode brauchen, und manchmal haben wir Methoden, bei denen wir eine Katze und einen Papagei brauchen (zum Beispiel eine Methode). zum Füttern einer Katze, hehe), und bei manchen Methoden werden alle drei Objekte benötigt. Ja, wir können diese drei Objekte zunächst im Hauptobjekt erstellen und sie dann an unsere Klassen und innerhalb der Klassen an die Methoden übergeben, die wir benötigen ... Und so weiter im gesamten Programm. Und wenn wir uns außerdem vorstellen, dass wir in regelmäßigen Abständen die Liste der akzeptierten Parameter für unsere Methoden ändern möchten (naja, wir haben beschlossen, etwas neu zu schreiben oder Funktionalität hinzuzufügen), dann müssen wir bei Bedarf ziemlich viele Änderungen am Code vornehmen ändere etwas. Was wäre, wenn wir uns vorstellen, dass wir nicht 3, sondern 300 solcher Objekte haben? Eine Alternative besteht darin, alle unsere Objekte dieser Art in einer gemeinsamen Liste von Objekten ( List<Object> ) zusammenzufassen und diese an alle Methoden zu übergeben und aus den Methoden heraus dieses oder jenes Objekt zu erhalten, das wir benötigen. Was aber, wenn wir uns vorstellen, dass im Verlauf des Programms ein Objekt zu dieser Liste hinzugefügt oder (was noch schlimmer ist) gelöscht wird? Dann kann bei allen Methoden, bei denen wir Objekte anhand ihres Index aus der Liste abrufen, alles kaputt gehen. Dann entscheiden wir uns, keine Liste, sondern eine Karte zu speichern, wobei der Schlüssel der Name des Objekts ist, das wir benötigen, und der Wert das Objekt selbst ist, und dann können wir die benötigten Objekte daraus einfach anhand ihres Namens abrufen : get("parrot") und als Antwort erhielten wir ein Objekt parrot Oder der Schlüssel ist beispielsweise die Klasse des Objekts und der Wert das Objekt selbst. Dann können wir nicht mehr den Namen des Objekts angeben, sondern einfach die Klasse des benötigten Objekts, was auch praktisch ist. Oder schreiben Sie sogar eine Art Wrapper über die Karte, in dem Sie Methoden erstellen können, sodass Sie in einigen Fällen Objekte anhand ihres Namens und in anderen Fällen anhand ihrer Klasse abrufen können. Dies ist, was wir aus dem Frühlingsanwendungskontext erhalten . Ein Kontext ist eine Menge von Beans (Objekten). Wenn wir uns dem Kontext zuwenden, können wir die benötigte Bean (das Objekt) beispielsweise anhand ihres Namens, ihres Typs oder etwas anderem ermitteln. Darüber hinaus können wir Spring bitten, in seinem Kontext nach der benötigten Bean zu suchen und sie an unsere Methode zu übergeben. Wenn wir zum Beispiel eine Methode wie diese hätten:
public void doSomething(Cat cat) {
    ...
}
Als Spring diese Methode für uns aufrief, übergab es das Objekt unserer Katze aus seinem Kontext an sie. Nun entscheiden wir, dass unsere Methode neben einer Katze auch einen Papagei braucht. Den Frühling nutzen – für uns gibt es nichts einfacheres! Wir schreiben einfach:
public void doSomething(Cat cat, Parrot parrot) {
    ...
}
und wenn Spring diese unsere Methode aufruft, wird es verstehen, dass wir hier eine Katze und einen Papagei übergeben, zu ihrem Kontext gehen, diese beiden Objekte abrufen und sie an unsere Methode übergeben müssen. Indem wir die Leitung unseres Programms an Spring übergeben haben, übertragen wir ihm auch die Verantwortung für die Erstellung von Objekten und deren Übergabe an unsere Methoden, die er aufrufen wird. Es stellt sich die Frage: Woher weiß Spring, welche Objekte (Bins) erstellt werden müssen?

Anwendungskonfigurationsmethoden

Es gibt drei Hauptmöglichkeiten, eine Anwendung zu konfigurieren (d. h. Spring mitzuteilen, welche Objekte wir bearbeiten müssen):
  1. Verwendung von XML-Dateien/Konfigurationen;
  2. Verwenden von Java-Konfigurationen;
  3. automatische Konfiguration.
Spring-Entwickler ordnen sie in dieser Prioritätsreihenfolge:
  • Die Methode mit der höchsten Priorität, der der Vorzug gegeben werden sollte, ist die automatische Konfiguration.
  • Wenn es bei Verwendung der automatischen Konfiguration nicht möglich ist, alle möglichen Beans korrekt zu konfigurieren, verwenden Sie die Java-Konfiguration (Erstellen von Objekten mithilfe von Java-Code).
  • Nun, der Weg mit der niedrigsten Priorität ist der altmodische Weg, nämlich die Verwendung von XML-Konfigurationen.
Darüber hinaus können Sie mit Spring diese Methoden kombinieren. Lassen Sie Spring beispielsweise alles tun, was automatisch konfiguriert werden kann. Wenn Sie einige spezielle Parameter angeben müssen, können Sie dies mithilfe von Java-Konfigurationen tun. Darüber hinaus können Sie einige Legacy-Konfigurationen im XML-Format verbinden. Generell lässt sich das alles recht flexibel umsetzen. Aber wenn alles mit automatischen Einstellungen erledigt werden kann, verwenden Sie es. Ich werde nur die automatische Konfiguration und Java-Konfigurationen berücksichtigen; XML-Konfigurationen werden bereits in fast jedem Spring-Beispiel im Internet verwendet, und wenn Sie erst einmal verstanden haben, wie die Java-Konfiguration funktioniert, sollte es kein Problem sein, eine XML-Datei zu „lesen“, die das Gleiche tut. Die automatische Konfiguration wird verwendet, wenn die Objekte, die wir für die Arbeit benötigen, Objekte von Klassen sind, die wir geschrieben haben . Wenn zum Erstellen eines Objekts unserer Klasse eine ganz bestimmte Logik erforderlich ist oder wenn wir nicht die Möglichkeit haben, eine Klasse mit der von uns benötigten Annotation zu markieren, die von der automatischen Konfiguration erfasst würde, kann dies in Java-Konfigurationen erfolgen . Im nächsten Teil erstellen wir ein Maven-Projekt, verbinden ein paar zentrale Federmodule damit und erstellen unsere ersten Beans.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION