„Frühling lernen ist eine Unsinnsstunde“ - Josh Long, der Hauptevangelist von Spring in der Innenküche des Projekts

Heute ist Josh Long in unserem virtuellen Studio der berühmteste Redner der Welt für den Frühling.


Seine Berichte eröffnen Java-Konferenzen auf der ganzen Welt. Er ist es, der Community-Fragen beantwortet, Frühlingstipps auf YouTube macht, es ist seine „Diese Woche im Frühling“, die wir jede Woche lesen und vieles mehr.


Übrigens erlaubte Josh, alle Materialien in unserem eigenen "Diese Woche in Java" zu verwenden , aber er tut dies in einem solchen Umfang und einer solchen Tiefe, dass diese Daten nie auf das "15-Minuten-Digest" -Format komprimiert werden konnten.


Manchmal scheint es, dass er in allen Städten gleichzeitig ist, Berichte liest und Artikel in einem Moment schreibt. Heute werden wir herausfinden, wie er es macht. Wir werden etwas über die "Code-Jurgenisierung" erfahren, die Gründe für die erstaunliche Vitalität von Spring und wie er es geschafft hat, so viele Jahre ohne globales Umschreiben von Grund auf und andere interessante Funktionen zu leben.




Mitglieder


Josh Long, Spring Developer Advocate bei Pivotal


Evgeny Trifonov, Oleg Chirukhin - Herausgeber der JUG.ru-Gruppe



Jeder weiß, dass Sie viel reisen, aber es wäre interessant, wenn Sie Statistiken erstellen könnten - wie viele Konferenzen Sie letztes Jahr besucht haben, wie viele Flüge Sie gemacht haben und dergleichen.



Gute Frage. Ich habe eine Tabelle, in der alle Besprechungen aufgezeichnet sind, an denen ich für das Jahr teilnehme. Meine Assistentin Tasha hilft mir bei der Organisation des Zeitplans und dieser Tabelle. Öffnen wir also dieses Tablet am Telefon ... Zweihundertvierzig. Im Jahr 2018 habe ich derzeit 240 verschiedene Veranstaltungen besucht. Einige dieser Treffen finden online statt (wie unsere), aber ich muss zu den meisten fliegen. In diesem Jahr bin ich über eine halbe Million Meilen geflogen. Lassen Sie mich die Entfernung von der Erde zum Mond überprüfen ... Es sind 239.000 Meilen, damit ich zum Mond und zurück fliegen kann.



"Zum Mond und zurück vom Frühling." Guter Titel für Tolkiens Buch.



Bieten Fluggesellschaften Ihnen Sonderangebote an, weil Sie so viel fliegen?



Nun, ich beschwere mich nicht über den Service. Ich fliege oft mit United Airlines und sie haben ein Global Services-Programm. Sie können nur durch eine Einladung dorthin gelangen - Sie selbst können nicht selbst danach fragen, und welche Kriterien sie hat, ist unbekannt. Jedes Jahr laden sie Leute ein, die am häufigsten fliegen. Letztes Jahr sagte jemand, dass er 1% der häufigsten Kunden weltweit auswählt. Oder sie filtern nach Kosten. Auf die eine oder andere Weise behandeln sie mich sehr gut. Es ist schön. Aber selbst in diesem Fall denke ich, dass Flüge für die meisten Menschen eine Belastung sind. Es geht mich definitiv an. Ich fliege nicht für die Flüge selbst, sondern um Leute zu treffen, die Spring nutzen. Ich würde teleportieren, wenn es eine solche Gelegenheit gäbe. Das Leben wäre viel einfacher und interessanter.



Guter Grund, auf Hyperloop zu warten.



Ja, aber das muss lange warten.



Lassen Sie uns über ein Thema sprechen, das näher am Frühling liegt. Sie sprechen mit Menschen auf der ganzen Welt darüber - gibt es regionale Unterschiede in der Verbreitung?



Ich würde nicht sagen. Spring war schon immer zu 100% Open Source, und solange Menschen Software schreiben, die im Internet funktioniert, wird Spring weltweit weiterhin erfolgreich sein. Es stimmt, es gibt andere Open-Source-Projekte, bei denen die regionale Spezifität spürbar ist. Ich kann Statistiken derzeit nicht bestätigen, aber es scheint mir, dass GridGain in Russland sehr verbreitet ist.



Ja es ist wahr.



Und in China ist MyBatis sehr beliebt. In den USA und in Europa habe ich es seit 10 Jahren nicht mehr gesehen, und in China ist es so häufig wie im Frühling. Und tatsächlich ist an MyBatis nichts auszusetzen, es ist schnell und leistungsstark - warum also nicht?



Wir haben ein Projekt gemacht, in dem MyBatis mit GridGain zusammenarbeitet.



(lacht) Also benutzt du beide - großartig! Ich mag diese beiden Technologien. Es gab keine normale Unterstützung für MyBatis und ich fragte ständig verschiedene große Unternehmen in China, die erstaunliche Dinge taten - warum brauchten sie MyBatis mit Spring? Es gibt viele andere Optionen, der Ruhezustand funktioniert sehr gut und MyBatis wird im Westen praktisch nicht verwendet. Infolgedessen habe ich beschlossen, dass nach der Verwendung des Programms der normale Betrieb sichergestellt werden muss. Wenn Sie sich jetzt die Spring Boot Starter-Quellen für MyBatis ansehen, sehen Sie dort meinen Namen. Ich wollte, dass diejenigen, die dieses Programm im Osten brauchen, normal damit arbeiten können. Im Allgemeinen stammt ein wesentlicher Teil meiner Arbeit aus den Entdeckungen, die ich auf meinen Reisen in verschiedenen Ländern mache.



Sie sind der Pivotal Developer Advocate für Spring-Projekte. Was bedeutet das in der Praxis? Was genau machst du?



Eine schwierige Frage. Das Konzept von Developer Advocate hat sich dank Apple und insbesondere Microsoft verbreitet. Es begann vor ungefähr 30 Jahren, als Microsoft erkannte, dass es die Entwickler waren, die echte Stärke hatten. Wenn Ihre Plattform erfolgreich und nützlich sein soll, müssen Entwickler neue wertvolle Dinge auf dieser Plattform erstellen. Dementsprechend müssen Sie sie von den Vorteilen Ihrer Plattform überzeugen. Microsoft begann, Entwickler auf verschiedene Weise zu motivieren. Sie haben Visual Studio sehr billig gemacht, das heißt, sie haben erschwingliche Tools bereitgestellt. Sie haben viele sehr interessante APIs erstellt, mit denen Sie unter Windows arbeiten können. Im Allgemeinen erkannte Microsoft, dass es notwendig war, mit der Community zusammenzuarbeiten. Menschen vertrauen nicht Software, sondern anderen Menschen. Menschen haben keine emotionale Bindung an Software. Sie können sich vorstellen, wie sehr Sie möchten, dass Sie berühmt werden, indem Sie einfach ein Programm in Einsamkeit in Ihrem Hotelzimmer schreiben, und jeder, der es benötigt, findet die Dokumentation selbst. In der Realität geschieht dies jedoch normalerweise nicht. Ein wesentlicher Teil meiner Verantwortung ist die Kommunikation mit Menschen aus der Gemeinde. Ich höre zu, was die Leute sagen, bringe es zu den Entwicklern und gebe dann an die Community weiter, was die Entwickler sagen. Mit anderen Worten, ich bin eine Art Fahrzeug.

Das Frühlingsteam ist komisch und wunderschön. Sie ist schon mehr als eineinhalb Jahrzehnte alt. Anfangs war sie sehr klein und die Entwickler selbst waren in der Beratung tätig. Sie arbeiteten ständig mit anderen Teams zusammen und halfen ihnen bei der Erstellung ihrer eigenen Software, das heißt, sie lösten echte Probleme und saßen nicht in einem Elfenbeinturm eingesperrt. Sie gaben nicht vor, im Voraus zu wissen, welche Software benötigt wurde, sondern schrieben, was andere wirklich brauchten, und ihr Nutzen war immer ihr Hauptkriterium. Sie teilten ihren Kunden ihr Leid bei der Lösung von Problemen mit. Wir erschaffen keine nutzlosen Dinge. Und dies ist, wie Sie wissen, häufig ein Problem beim Erstellen von Software. Tatsächlich bestand das erste Spring-Team bereits aus Developer Advocates. Sie waren nicht ähnlich zu dem, was Programmierer normalerweise darstellen. Ja, sie waren talentierte Entwickler, aber gleichzeitig diskutierten sie eifrig ihre Ideen mit anderen Menschen, besuchten Präsentationen, trafen Leute, machten Bekanntschaften und führten Dialoge. Dank dessen gewann der Frühling schnell an Popularität.

Das Problem ist, dass dieser Ansatz nicht gut skaliert. Es ist unmöglich, dass alle Entwickler die Hälfte ihrer Zeit mit Reisen, Chatten und Besprechungen verbringen. Als ich mich dem Team anschloss, schrieb ich bereits Code für Spring, da es sich um ein Open Source-Projekt handelt. Außerdem hatte ich bereits Bücher veröffentlicht, Artikel geschrieben und Präsentationen gehalten. Deshalb habe ich bereits versucht, Spring der Community so gut wie möglich vorzustellen und möglichst vielen Menschen die Möglichkeit zu geben, es kennenzulernen. Aus diesem Grund hat mich das Spring-Team eingeladen, dasselbe zu tun, jedoch fortlaufend und für Geld. Ich glaube, ich bin zu 80% Developer Advocate und zu 20% Programmierer, während der Rest des Developer Advocate-Teams zu 20% und zu 80% aus Programmierern besteht.

Alles in allem ist es meine Aufgabe, mit der Community in Kontakt zu bleiben, und es gibt viele verschiedene Möglichkeiten, dies zu tun. Ich schreibe mein sechstes Buch, es heißt The Reactive Spring Book; Mein vorheriger wurde von O'Reilly mit dem Namen Cloud Native Java veröffentlicht. Ich habe viele Video-Tutorials erstellt, die Sie in Safari Books Online ansehen können. Jedes dauert 4-5 Stunden. Außerdem poste ich jeden Mittwoch Videos mit Frühlingstipps auf YouTube , von denen jedes einem bestimmten engen Aspekt des Ökosystems gewidmet ist. Sie dauern normalerweise zwischen 45 Minuten und einer Stunde, jedes Jahr mache ich mindestens zwei Jahreszeiten, manchmal drei. Daher bereite ich von Jahr zu Jahr alle zwei Wochen genügend Material für einen vollständigen Bericht auf der Konferenz vor. Ab Januar 2011 mache ich ausnahmslos jeden Dienstag einen neuen Blogeintrag, "Diese Woche im Frühling" , in dem ich die interessantesten im Ökosystem überprüfe. Ich habe auch andere Blogs, die letzten beiden Abende habe ich genau das gemacht. Darüber hinaus schreibe ich Code und spreche auf Konferenzen. Meine Arbeit umfasst also das Maximum einer Vielzahl von Aktivitäten - aber ich könnte mich durchaus auf eine Sache beschränken. Es gibt Leute, die nur bloggen oder nur Videos machen, und sie machen das sehr gut. Einige reisen nicht einmal, sondern führen Seminare online durch. Mein Ansatz unterscheidet sich von den anderen, aber letztendlich verfolgt all diese Aktivität das gleiche Ziel.



Zu meinen Aufgaben gehören übrigens auch das Erstellen von Tutorials, das Bloggen usw. Für mich ist es sehr schwierig und kann beliebig lange dauern. Wie schwer ist es dir gegeben? Nehmen wir an, wie lange dauert die Vorbereitung eines Spring Tips-Videos?



Ich habe vergessen zu sagen - ich habe einen neuen Podcast bekommen, es ist noch nichts dabei herausgekommen, aber sieben Interviews wurden bereits vorbereitet :-) Die Zeit für die Vorbereitung geschieht auf unterschiedliche Weise. Wenn ich bereits mit dem Thema vertraut bin, das ich behandeln wollte, muss ich mich nur hinsetzen und alles zwei- oder dreimal aufnehmen - ich mache immer viele Fehler. Es dauert ungefähr vier Stunden einmal pro Woche, das heißt ein wenig. In anderen Fällen reicht dies jedoch nicht aus. Manchmal studiere ich ein Problem und mache mir viele Monate lang Notizen darüber. Dann entscheide ich, dass ich, da diese Arbeit bereits erledigt ist, ein Video dieser Notizen machen sollte. Ich lerne ständig, wie Sie es wahrscheinlich sind. Aber Situationen, in denen ich etwas speziell für das Video lernen muss, sind selten. Am schwierigsten ist es hier zu entscheiden, was Sie brauchen, um sich zu setzen und sich mit dem Thema zu befassen, und nicht mit dem Lernprozess selbst.

Manchmal veröffentlichen die Programmierer unseres Teams etwas, das noch niemand zuvor erstellt hat. In dieser Situation haben die Leute natürlich Fragen, und diese Fragen fallen standardmäßig auf Programmierer. Und ich kann ein Video machen, in dem alles erklärt wird, und es vorab in das Netzwerk hochladen, damit die Leute Zeit haben, sich kennenzulernen. Natürlich muss ich in dieser Situation auch lernen - da es sich um etwas völlig Neues handelt.



Wie viele Projekte gibt es derzeit im Frühjahr?



Gute Frage. Ich denke ein paar Dutzend. Es gibt sehr spezialisierte Module, von denen einige von der Community, einige vom Spring-Team von Pivotal oder anderen großen Unternehmen entwickelt werden. Die gesamte Unterstützung für Google GCP erfolgte in Google, die Unterstützung für Microsoft Azure - in Microsoft. Aber vieles - wie zum Beispiel MyBatis - wird von der Community entwickelt. Darüber hinaus verfügen wir über separate Module, z. B. Spring Data Neo4j, ein Modul für die Neo4j-Diagrammdatenbank. Es ist Teil des Spring Data-Projekts, aber es wurde in Zusammenarbeit mit Neo4j durchgeführt. Sie haben die Hauptarbeit an diesem Projekt geleistet. Er lebte nur in unserem Git-Repository. Es gibt viele solcher Beispiele.

Was Spring Boot betrifft, haben wir einen wunderbaren Mechanismus namens Auto-Konfiguration, der damit arbeitet. Es bietet Menschen eine bequeme Möglichkeit, zu gruppieren, woran sie arbeiten werden. Die Person lädt die JAR-Datei einfach in ihren Klassenpfad herunter und sie wird automatisch zur laufenden Spring Boot-App hinzugefügt. Es gibt viele solcher Autokonfigurationen im Ökosystem, ich weiß nur nichts über einen wesentlichen Teil. Sie funktionieren wie Plugins.



Und wie kann man Benutzer in all diesen verschiedenen Projekten verstehen? Gibt es eine allgemeine Struktur oder Idee?



Höchstwahrscheinlich benötigen Sie nicht alle Projekte. Bestimmen Sie Ihr Ziel und wählen Sie das gewünschte Projekt basierend darauf aus. Ich mag es nicht, wenn Leute versuchen, den Frühling zu lernen - dies ist eine bedeutungslose Übung. Die Frage sollte folgendermaßen gestellt werden: Ich muss beispielsweise eine REST-API schreiben. Mein erster Schritt ist, zu spring.io/guides zu gehen , wo Sie einen einfachen und erschwinglichen Leitfaden finden, der 10-15 Minuten dauert . Es enthält alles, was Sie wissen müssen: Welchen Code Sie schreiben müssen, in welchen Ordner, wie Sie ihn in IntelliJ oder Eclipse oder in etwas anderem ausführen müssen. Wir versuchen, alles sehr detailliert zu erklären und lassen nichts aus, weil wir möchten, dass diese Anleitungen für alle zugänglich sind. Was auch immer Sie tun - JMS, Neo4j, Sicherheit, Leistungsschalter, Kafka - wir haben für jedes Thema einen eigenen Leitfaden. Entscheiden Sie sich für Ihre Aufgabe und wählen Sie die entsprechende Anleitung aus. Sie müssen nicht an Spring denken, sondern darüber, in was Sie Ihr System integrieren werden - Spring ist nur ein Werkzeug, das diese Integration ermöglicht. Daher macht es keinen Sinn, „Frühling zu lernen“ - Sie müssen ihn verwenden, wenn dies Ihre spezifische Aufgabe vereinfachen kann.



Welche Projekte im Frühjahr sind Ihrer Meinung nach die vielversprechendsten? Oder am meisten unterschätzt?



Die Spring Retry-Bibliothek ist sehr beliebt. Es wurde ursprünglich bei Spring Batch entwickelt. Ich weiß nicht, ob Sie jemals Spring Batch verwendet haben. Es ermöglicht Ihnen, große Mengen sequentiell übertragener Daten zu verarbeiten, z. B. Dokumente aus dem Dateisystem, XML-, CSP-Dateien usw. In einem Anwendungsfall für dieses Tool lesen Sie einen Datensatz und schreiben ihn dann - beispielsweise von einem Webdienst in eine Nachrichtenwarteschlange. Die Verarbeitung dieser Daten kann Stunden dauern, und es wäre äußerst unerwünscht, wenn das System aufgrund eines Fehlers am Ende alle während der Nacht geleisteten Arbeiten zurücksetzen würde. Das kannst du nicht machen. Spring Batch arbeitet mit Datenpaketen und verarbeitet nicht nur einen, sondern zehn oder tausend Datensätze. Selbst wenn die Verarbeitung von Tausenden von Datensätzen verloren geht, wird der Rest gespeichert. Darüber hinaus müssen Sie beim Schreiben von Paketsystemen berücksichtigen, dass Sie auf andere Dienste zugreifen müssen, die möglicherweise fehlschlagen. Dafür gibt es Spring Retry. Mit dieser Bibliothek können Sie wiederholt Dienste anrufen. Darüber hinaus können Sie eine exponentielle Verschlusszeit verwenden. Neben Spring Batch wird Spring Retry auch in Spring Integration, Spring Cloud Stream und Spring Cloud Data Flow verwendet. In den letzten beiden unterstützen wir Spring Retry aufgrund seiner Verbindung mit einigen anderen Dingen. Daher wird diese Bibliothek in vielen Frühlingsprojekten verwendet, und ich bin nicht sicher, ob jeder davon weiß. Spring Retry ist eine sehr häufig verwendete Bibliothek, die manchmal einfach übersehen wird. Im Allgemeinen haben wir viele verschiedene reaktive Dinge. Sie sind normalerweise die interessantesten.



Warum genau Reaktivismus?



Wir haben überall Reaktivität. Der Vorteil von Spring ist, dass Sie damit ein Projekt starten und beenden können. Diese Woche haben wir angekündigt, dass wir das Facebook RSocket- Projekt unterstützen werden. Dies ist ein vollständig reaktives Analogon von gRPC, jedoch wesentlich flexibler. Es kann für Pub / Sub, Streaming-Daten, Client-Anfrage / Antwort verwendet werden - im Allgemeinen können Sie damit viele verschiedene Messaging-Muster implementieren. Und es wird auf Facebook verwendet. Es gibt zwei Bundles, eines in C ++, das andere in Java. Die in Java wurde mit Reactor, unserer reaktiven Bibliothek, geschrieben. Sie verwendet Salesforce. Natürlich gibt es auch andere Möglichkeiten. Haben Sie von gRPC von Google gehört? Es ist von sehr hoher Qualität und interessant, aber es ist nicht reaktiv. Standardmäßig funktioniert es nicht gut mit reaktiven Typen. Salesforce gRPC hat diesen Nachteil nicht. Er hat einen Compiler, der Dienste basierend auf Spring Reactor erstellt. So konnten sowohl Facebook als auch Salesforce Reactor auf ihre Bedürfnisse skalieren.

Der Reaktor selbst ist eines unserer interessantesten Projekte. RxJava kam früher heraus, aber Reactor war der erste, der reaktive Thread-Unterstützung bot. Dies geschah größtenteils, weil der wundervolle Programmierer David Karnock, RxJava-Projektmanager, mit uns an Reactor gearbeitet hat. Ein bedeutender Teil all der neuen und interessanten Dinge, die in unserem Ökosystem passiert sind, hat Reactor irgendwie berührt. Dank dessen ist das Projekt für Unternehmen, die große Systeme erstellen, äußerst attraktiv geworden. Der Reaktor liegt auch dem Spring WebFlux-Framework zugrunde. Basierend auf Reactor haben wir auch Unterstützung für reaktives Messaging, reaktive Web-Sockets, Spring Cloud Stream, reaktive Leistungsschalter usw. bereitgestellt - all diese Komponenten können in reaktive Anwendungen integriert werden. Sie können natürlich nur Spring verwenden, aber ich bevorzuge es, das gesamte Ökosystem mit diesen reaktiven Typen zu verwenden.

Darüber hinaus haben wir kürzlich eine Ankündigung zu R2DBC gemacht - unserer API für den Zugriff auf SQL-basierte Daten für reaktive Treiber. Reaktiver JDBC existiert noch nicht. Das Problem ist, dass Sie die Sperre nicht verwenden können, wenn Sie reaktiven Code verwenden. Wenn Sperren verwendet wird, muss diese Interaktion vergrößert werden, wodurch die Anzahl der Threads erhöht wird. Und dies widerspricht dem ursprünglichen Ziel, da wir nur eine Skalierung vermeiden möchten, indem wir die Anzahl der Threads erhöhen - dies ist zu teuer. Daher bietet R2DBC eine Abstraktion, die einen reaktiven Datenzugriff ermöglicht. Es gibt Datenbanktreiber, die anfangs reaktiv sind, z. B. Postgres. So können Sie R2DBC unter anderem mit Postgres verwenden und mit reaktivem SQL arbeiten, ohne eine Sperre zu verwenden, da Sie keine Threads haben. Dieses ganze Thema scheint mir äußerst interessant zu sein.



Vielleicht könnten Sie einige häufig gestellte technische Fragen beantworten? Eines der Probleme besteht darin, dass bei Verwendung mehrerer Spring-Projekte viele Anmerkungen gleichzeitig auftreten. Es wird schwierig herauszufinden, was jeder von ihnen tut. Sie können nicht einfach darauf klicken, während Sie die Strg-Taste gedrückt halten, und zur Definition wechseln. Wie soll man sich in einer solchen Situation verhalten?



Es sollte mit der Option "--debug" ausgeführt werden. Der größte Teil des Spring-Ökosystems existiert jetzt als automatische Konfiguration. Ein Teil ähnelt einer importierten Konfiguration. Wenn Sie in diesem Fall auf die Anmerkung klicken, wird die Inschrift "@ Import" angezeigt, die dann die Klasse angibt. Wenn Sie dann darauf klicken, sehen Sie die Objekte, die für Sie erstellt wurden. Manchmal funktioniert Spring jedoch über den automatischen Konfigurationsmechanismus. In dieser Situation werden keine Anmerkungen erstellt. Es gibt nur eine Bibliothek und einen Klassenpfad. Dann ist es wirklich schwer herauszufinden, was passiert und warum. Aber wir möchten es den Menschen so einfach wie möglich machen, dies herauszufinden. Hierzu gibt es den Parameter `--debug`, der beim Start der Anwendung eingegeben werden muss. Anschließend wird ein Bericht angezeigt, in dem alle von der Anwendung beim Start ausgeführten Schritte beschrieben werden. Die Anwendung prüft, ob Felder oder Klassen vorhanden sind, und entscheidet abhängig davon, ob Objekte dafür erstellt werden sollen oder nicht. Der Bericht zeigt Ihnen, welche Bedingungen erfüllt waren, welche nicht und welche Konfigurationen nicht von Überprüfungen abhängig waren. Wenn Sie also beispielsweise nicht verstehen können, warum Ihre Verbindung zu Kafka nicht funktioniert, können Sie sich die entsprechende Bedingung ansehen - möglicherweise haben Sie nicht die erforderliche Klasse im Klassenpfad.



Jetzt wird es eine kleine Trolling-Frage geben. Gegner von Spring behaupten oft, dass dies die Ursache für eine Architektur von geringer Qualität ist, da Sie @Autowired einfach überall und überall verwenden können. Stimmen Sie dieser Meinung zu? Vor zehn Jahren wurde die Architektur in drei Ebenen erstellt, die Werte wurden vom Konstruktor zum Konstruktor übertragen und DTOs wurden erstellt. Mit Spring können Sie all dies loswerden. Ist es gut oder schlecht?



Der Frühling ist ein Werkzeug. Es ermöglicht mehr Menschen, Software zu erstellen, die zur Produktion kommt und ordnungsgemäß funktioniert. Ich halte sie daher nicht für schädlich. In den letzten Jahren haben Millionen von Menschen Anwendungen damit erstellt, und für sie funktioniert alles einwandfrei. Zu denken, dass der Frühling als Ganzes schädlich ist, ist absurd. Eine solche Meinung kann nicht als unwissend bezeichnet werden.

Im Frühjahr können Sie eine recht explizite Verkabelung erstellen. Wenn Sie befürchten, dass nicht klar ist, woher das angegebene Objekt stammt, können Sie es selbst binden. Sie können eine Java-Konfiguration erstellen, in der eine Methode eine andere aufruft und der Ausgabewert der aufgerufenen Methode ein Bin ist - Spring kümmert sich darum. Selbst wenn Sie denselben Bin wiederholt oder tausende Male aufrufen, haben Sie nie mehr als einen Link, wenn dieses Objekt ein Singleton ist. Sie möchten, dass alles explizit ist - es kann getan werden. Wenn Sie möchten, können Sie sich einer noch langweiligeren Option zuwenden - XML. Unter dem Strich kann dies vollständig vermieden werden, wenn Sie "@ Autowired" nicht verwenden möchten.

Wenn Sie Spring Boot am häufigsten verwenden, haben Sie nur eine Bean. Sie wissen, dass Sie eine Bean vom Typ "ConnectionFactory" benötigen - in diesem Fall ist es kein Problem, eine Injektion nach Typ durchzuführen. Sie haben immer noch nur ein Objekt, Sie haben nicht zwei "ConnectionFactory" für eine "Verbindung". Sie haben keine zwei Hibernate-Sitzungen, daher hindert Sie nichts daran, "HibernateSession" zu injizieren - es ist immer noch in einer einzelnen Instanz vorhanden. Wenn Sie möchten, dass alles explizit ist, können Sie die Annotation "@ Qualifier" verwenden. Damit markieren Sie, was Sie injizieren, nach Typ. Dies ermöglicht es, die verschiedenen Bin-Implementierungen voneinander zu unterscheiden. Angenommen, Sie haben einen Dienst, über den Anwendungen an einem Ort mit iTunes kommunizieren können, an einem anderen - mit Amazon, am dritten - mit dem Android Play Store. Es werden drei verschiedene Bohnen eines anderen Typs sein, aber jede wird die Anmerkung "@ Qualifier" haben. Ferner kann diese Annotation einer anderen Annotation überlagert werden, wodurch die Typensicherheit gewährleistet wird. Sie binden diesen Typ und haben darüber eine Anmerkung. Wenn die Bean erstellt wird, enthält sie die Anmerkung "@ Qualifier", auch auf der Website des Verbrauchers. Somit erhalten Sie durch diese Anmerkungen Links, und selbst wenn Sie drei Implementierungen haben, während das Programm ausgeführt wird, können Sie immer noch die finden, die Sie benötigen.



Das heißt, Ihrer Meinung nach ist Flexibilität im Allgemeinen ein positives Merkmal. Halten Sie und das Spring-Team einige grundlegende Prinzipien wie Zen Zen ein?



Ja, halte dich daran. Übrigens programmiere ich seit Ende der 90er Jahre in Python und bin ein großer Befürworter von Python Zen. Es hat eine sehr korrekte allgemeine Idee. Was Ihre Frage betrifft, müssen Sie hier über Jürgen Höller, Mitbegründer von Spring und den zweiten Entwickler, der an dem Projekt gearbeitet hat, sprechen. Dies ist ein Schatz, sehr ruhig, einer der besten, mit denen ich kommunizieren musste. Es ist sehr einfach, mit ihm zu sprechen, wenn Sie ihn beispielsweise auf einer Konferenz getroffen haben. Gleichzeitig hat er einen starken Intellekt und sein Beitrag zum Frühling ist schwer zu überschätzen. Die JAX-Konferenz - sehr wichtig, obwohl sie den Joker natürlich nicht erreicht :) - verlieh ihm eine besondere Auszeichnung für Arbeiten, die noch niemand zuvor erhalten hatte. Normalerweise werden Auszeichnungen in einer speziellen Kategorie vergeben, aber diese ist ohne Kategorie und gehört nur Jürgen. Spring ist das einzige Projekt im Java-Ökosystem, das seit 15 Jahren nicht mehr neu geschrieben wurde - weil es keinen Bedarf gibt. Jürgen hat eine sehr klare Vorstellung davon, wie man Module schreibt, wie man Typen im Allgemeinen ausdrückt - wie man eine Basis von qualitativ hochwertigem Code schafft, der jahrzehntelang leben und sich bei Bedarf leicht ändern kann. Es gibt keine anderen derartigen Projekte im Java-Ökosystem. Ein bedeutender Teil der Projekte existiert nicht mehr, und selbst unter denen, die jemals von Grund auf neu geschrieben wurden, haben nur sehr wenige 15 Jahre gelebt.

Ohne umgeschrieben zu werden, dauerte nur der Frühling 15 Jahre, da er von Anfang an sehr sauber geschrieben wurde. Jürgen hat uns einige grundlegende Prinzipien beigebracht, denen wir folgen: wie man Module erstellt, wie man Implementierungspakete erstellt (im Gegensatz zum öffentlichen Teil), wie man die Oberflächenebene der API beschreibt und welche Designtypen dafür verwendet werden, welche Muster verwendet werden sollen. Mit Spring lernen Sie unweigerlich Designmuster kennen, und das war schon immer so. Ein Beispiel für das Mustermuster fällt sofort ein. Spring Integration führt Sie in Unternehmensintegrationsmuster ein, Spring MVC führt MVC ein. Alle diese Muster sind Teil des Frameworks, und wir verwenden sie basierend auf bewährten Praktiken. Unser Zen sind die Prinzipien, die Jürgen uns gelehrt hat. In dieser Hinsicht sind wir alle seine Schüler. Jürgen ist bekannt für seine etwas seltsame Herangehensweise an das Schreiben von Code - aufgrund seiner Art entstand sogar ein spezieller Begriff, "jurgenize". Unser Team hat viele wirklich kluge Leute mit großartiger Erfahrung, einige haben bereits Abschlüsse und kahle Stellen. Trotzdem nimmt Jürgen seine eigenen Änderungen an ihrem Code vor. Manchmal sind es kleine Dinge wie das Hinzufügen von Leerzeichen, das Bereinigen usw., aber manchmal wird der Code tausendmal besser von Grund auf neu geschrieben, und gleichzeitig wird die Urheberschaft des Codes nicht geändert, dh es wird unter dem Namen des ursprünglichen Autors festgeschrieben. In diesen Fällen wird gesagt, dass der Code „legalisiert“ wurde, das heißt, er wurde behoben. Dank Jürgen ist unser Code sehr sauber. Für Code-Analyse-Tools wird es als Qualitätsmerkmal angesehen, im Frühjahr zumindest eine Fehlfunktion festzustellen, da es sehr sauberen Code gibt. Im Allgemeinen kann ich unsere Prinzipien jetzt nicht im Detail darlegen, aber sie sind da, sie wurden von Jürgen festgelegt und alle Frühjahrsprojekte folgen ihnen. Für den Spring Boot haben wir sehr genaue Regeln für die Erstellung von Modulen, die wir Starter nennen.



Ok, danke für die Antwort. Meine letzte Frage betrifft die Leistung und Java 11. Soweit ich weiß, generiert Spring zur Laufzeit immer einen Kontext. Dies kann bei einigen alten Bankprogrammen von Minuten bis zu mehreren Stunden dauern.



Nun ja? Ich glaube nicht.



Ehrlich gesagt, mit meinen eigenen Augen gesehen.



Aber es kann nicht Frühling sein. Höchstwahrscheinlich wird dort mit Hibernate etwas Schreckliches getan. Bohnen können in Millionen generiert werden, eine leere Bohne kann sehr schnell kompiliert und ausgeführt werden. Das Laden von Informationen aus der Datenbank, die Validierung usw. dauert einige Zeit. Dies kann zu einer Verzögerung von Spring führen. Aber der Frühling selbst ist sehr schnell.



Ja, ich denke, es gab wirklich eine Art Horror mit Hibernate. Trotzdem beginnt der Frühling 30 Sekunden, manchmal ein oder zwei Minuten - es ist immer noch eine ziemlich lange Zeit, meinst du nicht auch? Wenn wir es beispielsweise in Docker ausführen, muss der Container sofort gestartet werden. Ist es möglich, die Startzeit des Frühlings zu verkürzen?



Ich brauche weniger als zwei Sekunden, um den Frühling zu starten. Mit der Spring Cloud-Funktion kann diese Zeit auf eine halbe Sekunde oder weniger reduziert werden. Wir haben Projekte, die in einer halben Sekunde problemlos ausgeführt werden können - zum Beispiel Spring Boot in Spring Cloud Function. Das Problem liegt also nicht im Frühjahr, sondern darin, was Sie mit ihnen machen, was im Hintergrund passiert - erhalten Sie Zugriff auf eine andere Datenquelle im Internet, laden Sie Dateien aus dem Internet herunter, laden Sie Daten in das Raster hoch . Wenn Sie nur kleine Microservices betreiben, sollte Ihr System sehr schnell arbeiten. Wenn Ihre Anwendung sehr lange ausgeführt wird, stimmt etwas nicht.



Ich verstehe. Haben Sie übrigens schon von GraalVM und AOT gehört?



Ja Ich erzähle Ihnen mehr: Wir haben ein Spring Fu-Projekt. Er ist experimentell, ich habe ein Video aus der Spring Tips-Serie über ihn gedreht. Wir haben es auf Kotlin geschrieben, jetzt hat es eine Java-API. Dieses Projekt wurde für Umgebungen wie GraalVM erstellt. Spring Fu verwendet keine dynamisch generierten Proxys oder "@ Configuration". Der native Bildgenerator in GraalVM muss wissen, welche Klassen geladen werden. Wenn Sie jedoch dynamisches Laden mit cglib oder Byte Buddy haben, ist die Verwendung von GraalVM schwierig. Hibernate, Spring und alle anderen Bibliotheken, die dynamisch generierte Proxys verwenden, eignen sich schlecht zum Erstellen eines nativen Images. Daher gibt es im Frühjahr Fu nichts Vergleichbares, dies wird direkt angegeben. Es wird immer noch Spring verwendet, aber der Ansatz zum Erstellen von Anwendungen ist anders. Und einer der Vorteile von Spring Fu ist, dass es gut mit GraalVM funktioniert. Und jetzt startet die Anwendung sofort. Ich meine, im Allgemeinen sofort: Sobald es vollständig in Erinnerung ist! Es sei daran erinnert, dass sich der native Bildgenerator in GraalVM noch in einem sehr frühen Entwicklungsstadium befindet. Aus diesem Grund treten manchmal Schwierigkeiten auf, da die von GraalVM gestartete Anwendung den Anschein hat, dass das Laden sofort sehr schnell beginnt und die Geschwindigkeit zur Laufzeit dieselbe ist wie zuvor. Dies ist jedoch nicht der Fall, da Sie in der GraalVM-Laufzeit die JVM nicht mehr verwenden und das Verhalten des Systems anders ist. Testen Sie dieses Projekt auf Gesundheit, aber denken Sie daran, dass es sich nicht um eine kostenlose Startbeschleunigung handelt. Und dennoch freue ich mich sehr über GraalVM. Das Team hat große Anstrengungen unternommen, damit es mit Frameworks besser funktioniert.



Meine letzte Frage betrifft natürlich Java 11.



Ja, sie ist wunderschön.



Was ist nützlich für den Frühling darin?



Für Spring-Entwickler gibt es zwei Hauptkriterien, nach denen wir diese oder jene Technologie auswählen: 1. ob sie für geschäftliche Anforderungen geeignet ist, 2. ob sie für uns als Programmierer geeignet ist. Was das erste Kriterium betrifft, ob diese Technologie eine höhere Geschwindigkeit und Stabilität bietet oder ob sie eine langfristige Unterstützung bietet. All dies ist in Java 11 vorhanden. Die Unterstützung für Java 8 wird bald eingestellt. Daher ist es sinnvoll, ein Upgrade auf die nächste Version mit langfristiger Unterstützung durchzuführen. Übrigens, meine Freunde, wenn Sie auf die nächste Version aktualisieren, nehmen Sie die OpenJDK-Assembly - sie ist in jeder Hinsicht hervorragend. Die richtige Version ist sehr einfach zu bekommen, ich habe bereits auf Twitter darüber geschrieben. Diese Version funktioniert sehr gut mit Spring - sie ist stabil. Sie können zumindest jetzt zu https://start.spring.io gehen, ein neues Projekt generieren, Java 11 auswählen und es wird funktionieren. Java 11-Unterstützung ist sowohl in IntelliJ als auch in Eclipse verfügbar.

Was das zweite Kriterium betrifft, gibt es für Spring-Entwickler in Java 11 keine wesentlichen Änderungen. Es ist schön, dass `var` und der HTTP-Client erschienen sind, aber Spring hatte bereits einen reaktiven WebClient, daher bin ich mir nicht sicher, ob wir vom HTTP-Client profitieren werden. In Java 10 und Java 9 wurden einige praktische Dinge hinzugefügt. Außerdem wurde es möglich, das Java-Programm als Skript auszuführen - das ist nicht schlecht. Ich bin mir nicht sicher, ob es Sinn macht, dies mit Spring zu tun - obwohl andererseits, warum nicht. Wie es aussehen wird, weiß ich nicht.



War es für Spring schwierig, auf Java 11 umzusteigen?



Nein. Im Zentrum des Frühlings stehen sehr hochwertige Bibliotheken und das Ökosystem. Beachten Sie, dass das Spring-Framework selbst sowohl Klassenpfad als auch Modulpfad unterstützt. Ich persönlich empfehle jedoch nicht, Modulpfad zu verwenden. Um es richtig zu verwenden, muss alles andere auch Modulpfad unterstützen. Und das ist noch nicht möglich, jetzt gibt es zu wenige Leute, die Modulpfad-Unterstützung in Bibliotheken anbieten. Der Klassenpfadmodus funktioniert recht gut. Wir hatten Standardprobleme mit CGLib, AspectJ und den JAXB-XML-Bibliotheken, die jeder beim Wechsel zu Java 9 hatte. Alle diese Probleme wurden ungefähr im letzten Jahr behoben, sodass uns der Übergang zu Java 11 leicht fiel.



Übrigens planen wir viele interessante Dinge für zukünftige Versionen von Java, zum Beispiel ist das Loom-Projekt Fasern für Java.



Wird es in Java 12 sein?



Höchstwahrscheinlich nicht, sie werden dies für einige Zeit tun.



Kotlin verwendet auch Coroutinen, daher ist dieses Projekt für uns sehr interessant. Wann immer er herauskommt, wird er von großem Nutzen sein. Die Fähigkeit, reaktive Pipelines auszudrücken, ohne reaktiven Code zu erstellen, ist sehr wichtig. Persönlich freue ich mich auf das Erscheinen eines mehrzeiligen Strings. Vielleicht ist dies nicht der beste Weg, um mir Zeugnis zu geben - ich habe viel Code, der eine große Anzahl von Zeilen erfordert, zum Beispiel SQL-Abfragen und dergleichen.



Dies liegt daran, dass Sie einen wesentlichen Teil des Codes für die Diashow optimiert haben. Auf Folien während Berichten ist es praktisch, die gesamte Zeichenfolge auf dem Bildschirm anzuzeigen.



Ja, sonst wird es schwer zu lesen. In der IDE sehen sie viel besser aus. Wieder Python, Kotlin, Scala, Groovy - jede Sprache in den letzten 20 Jahren hat mehrzeilige String-Unterstützung bereitgestellt. Meiner Meinung nach ist das ganz natürlich.



Vielleicht möchten Sie unseren Lesern einen Rat geben? Dies kann Spring oder Pivotal betreffen und Java als Ganzes betreffen.



Wie bei jeder Technologie ist der beste Teil des Frühlings seine Community. Technisch gesehen ist der Frühling eine äußerst interessante Reihe von Projekten, aber das Geheimnis seiner Langlebigkeit ist eine wunderbare Gemeinschaft. Niemand braucht Ihre wunderbare Software, wenn Sie mit unerträglichen Menschen kommunizieren müssen. Deshalb versuchen wir so freundlich wie möglich zu sein. Unsere Entwickler, einschließlich Projektmanager, beantworten Fragen zum Stapelüberlauf und folgen dort verschiedenen Tags. Wir haben Chatrooms auf Gitter und jeder Chatroom darin entspricht einem Repository auf GitHub. Zum Beispiel https://gitter.im/spring-projects/spring-boot . Dort finden Sie Spring-Entwickler und stellen die Fragen, die Sie interessieren.


Ich werde oft gefragt, wie ich dem Projekt helfen und wie ich anfangen kann, Code für Spring zu schreiben. Wir haben viele Probleme mit Tags wie "Ideal für Beiträge" auf GitHub. Wir freuen uns für alle, aber nicht alle Projekte passen zu jedem. Einige Fehler sind komplizierter als andere. Wenn Sie also mit uns zusammenarbeiten möchten, suchen Sie nach diesen Tags und helfen Sie bei Problemen. So erfolgt die Wiederauffüllung unserer Gemeinschaft. Wir schätzen die Arbeit aller, die zur Verbesserung unseres Ökosystems beitragen.



Minute der Werbung. Josh Long kommt mit einem Reactive Spring- Vortrag zur Joker 2018-Konferenz. Tickets können auf der offiziellen Website der Konferenz gekauft werden .

Source: https://habr.com/ru/post/de425961/


All Articles