WARUM
Zu Beginn seiner Geburt bestand der Hauptzweck der Erstellung des Frühlings darin, Java-Technologien auf hoher Gewicht zu ersetzen, insbesondere EJB. Im Vergleich zu EJB bietet Spring ein leichteres und einfacheres Programmiermodell.
WAS
Spring ist ein Open -Source -Framework, das erstmals von Rodjohnson erstellt wurde. Spring wurde erstellt, um die Komplexität der Anwendungsentwicklung auf Unternehmensebene zu lösen. Durch die Verwendung von Spring kann einfache JavaBeans Dinge implementieren, die nur EJB erreichen konnten. Der Frühling ist nicht auf die serverseitige Entwicklung beschränkt. Jede Java-Anwendung kann in Bezug auf Einfachheit, Testbarkeit und lockere Kopplung von Frühling profitieren.
Heute ist Spring an der mobilen Entwicklung, der Social -API -Integration, der NoSQL -Datenbank, Cloud Computing und Big Data beteiligt. Im Laufe der Zeit übernahm EJB auch die Konzepte der Abhängigkeitsinjektion (DI) und der Aspekt-orientierten Programmierung (AOP). Kurz gesagt, die grundlegendste Mission von Spring ist es, die Java -Entwicklung zu vereinfachen
WIE
Um die Komplexität der Java-Entwicklung zu verringern, verfolgt der Frühling eine 4-minütige Schlüsselstrategie
Leichte und minimale invasive Programmierung basierend auf Pojo ermöglicht eine lockere Kopplung durch Abhängigkeitsinjektion und Grenzflächenorientierung
Deklarative Programmierung basierend auf Abschnitten und Konventionen reduziert den Stilcode durch Abschnitte und Vorlagen
Pojo -Potenzial
Viele Frameworks erzwingen Anwendungen, um ihre Klassen zu erben oder ihre Schnittstellen zu implementieren, was dazu führt, dass Anwendungen an das Framework gebunden sind, nämlich die invasive Programmierung, was dazu führt, dass Codeblöcke nicht wiederverwendet werden können. Spring bemüht sich, Ihren Anwendungscode aufgrund seiner eigenen API zu vermeiden. In Anwendungen, die auf dem Frühjahr basieren, haben seine Klassen normalerweise keine Spur von Anzeichen, die Sie für die Feder verwenden.
öffentliche Klasse HelloWorldbean {public String sayshello () {return "Hallo Welt"; }} Der obige Beispielcode ist eine sehr einfache und gewöhnliche Java -Klasse (Pojo). Sie können nicht sagen, dass es sich um eine Federkomponente handelt. Die nicht-invasive Programmierung von Spring spiegelt sich in dieser Klasse wider, die sowohl in Frühlingsanwendungen als auch bei Nicht-Ring-Anwendungen eine Rolle spielen kann. Nur dieses Stück Code spiegelt die Funktionen von Spring nicht wirklich wider, und das folgende Wissen ist noch erforderlich.
Abhängigkeitsinjektion (injizieren der Klasse selbst abhängig)
Die Abhängigkeitsinjektion ist im Frühjahr nicht so hoch, obwohl sie sich zu einer komplexen Programmierungstechnik oder einem Konzeptmusterkonzept entwickelt hat. Dies wird im Frühling verstanden, das Abhängigkeiten injiziert. Eine Anwendung mit praktischer Bedeutung erfordert mehrere Klassen, um miteinander zusammenzuarbeiten, um bestimmte Geschäftslogik zu vervollständigen. Die traditionelle Praxis ist, dass jedes Objekt für die Verwaltung von Referenzen auf Objekte verantwortlich ist (dieses verwandte Objekt ist das Objekt, das von dem im Frühjahr ausgedrückten Objekt abhängt). Dies macht es jedoch schwierig, stark gekoppelte und Code zu testen.
Betrachten Sie den folgenden Code
/** Dieser schwierig zu mundempfindliche Unterrichtsname wurde vom Autor speziell benannt, um eine simulierte Szene anzupassen. */Public Class Damselrescingknight -implementiert Ritter {private resoredamselquest quest;/*** Rettungsamselquest in seinem Konstruktor erstellt. Emarkonquest () {Quest.EMBARK ();}} Die Kopplung hat zwei Seiten. Einerseits ist der eng gekoppelte Code schwer zu testen, wiederzuverwenden und zu verstehen, und es wird "gegen den Goblin" -Typ -Fehler kämpfen. Andererseits ist ein gewisses Maß an Kopplung erforderlich, und verschiedene Klassen müssen auf angemessene Weise interagieren.
Das Problem tritt auf, wie hat der Frühling es gelöst?
Im Frühjahr werden durch Abhängigkeitsinjektion (DI) die Abhängigkeiten zwischen Objekten durch die Komponenten von Drittanbietern im System festgelegt, die jedes Objekt beim Erstellen des Objekts koordinieren. Mit anderen Worten, Objekte müssen ihre internen Eigenschaften nur verwalten, ohne ihre Abhängigkeiten selbst zu erstellen oder zu verwalten, und die Abhängigkeiten werden automatisch in die Objekte injiziert, die sie benötigen.
/*** Dieser Ritter kann verschiedene Abenteueraufgaben ausführen, anstatt nur die vorherige zu retten, um das von Wung erstellte Mädchen am 2016/8/25 zu retten. */Public Class BraveKnight implementiert Ritter (Private Quest Quest;/*** BraveKnight schafft keine Abenteuertypen für sich, sondern überträgt Abenteueraufgaben als Parameter während der Konstruktion* Dies ist einer der Wege der Abhängigkeitsinjektion: Konstruktorinjektion*/public braveknight (Quest) {this.quest =} public void barkonquest) BraveKnight ist nicht mit einer spezifischen Quest -Implementierung verbunden. Solange eine Aufgabe die Quest -Schnittstelle implementiert, spielt es keine Rolle, welche Art von Abenteuer sie ist. Dies erreicht den Zweck der losen Kupplung
Wenn ein Objekt nur eine Abhängigkeit durch eine Schnittstelle angibt, kann diese Abhängigkeit durch verschiedene konkrete Implementierungen ersetzt werden, ohne dass das Objekt selbst bekannt ist.
Lassen Sie uns nun praktische Bedeutung injizieren
Für den obigen Code werden wir eine Abenteueraufgabe mit einer bestimmten Implementierung in den tapferen Ritter einfügen
/** Die Abenteuermission des Tötens von Drachen (dieser Autor ist eine gute zweite Klasse)*erstellt von Wung am 2016/8/25. */public class Slaydragonquest implementiert Quest {private printstream stream; public Slaydragonquest (PrintStream Stream) {this.stream = stream;} public void eMark () {Stream.print ("Töten Sie den Drachen");}}}}}}}}}}}}}}}Jetzt ist die Frage, wie das Printstream -Objekt in Slaydragonquest injiziert werden kann, wie das Questobjekt in Braveknight injiziert werden kann. Die oben genannte Quelle wird diese Abhängigkeiten zentral verwalten, und das Verhalten der Erstellung der Zusammenarbeit zwischen Anwendungskomponenten wird normalerweise als Assemblierung (Verkabelung) bezeichnet, dh Injektion. Die Spring bietet eine Vielzahl von Montagemethoden, die sie später ausführlicher einführen können. Hier stellen wir kurz die Baugruppe vor, die auf XML und der Baugruppe basierend auf Java -Anmerkungen basiert.
<!- Dies ist ein Montageprozess. Declare Slaydragonquest als Bohne mit dem Namen "Quest". Da es sich um eine Konstruktorinjektion handelt, verwenden Sie den Konstruktor-Arg-Attributwert, um den injizierten Wert darzustellen. Dieser Prozess löst das vorherige Problem. Injizieren Sie das PrintStream-Objekt in das Slaydragonquest-Objekt-> <bean id = "quest"> <constructor-arg value = "#{t (System) .out}"> </constructor-arg> </bean> <!-Dieser Vorgang ist wie oben. BraveKnight deklariert eine Bohne mit dem Namen "Ritter" (dieser Name wird nicht unbedingt verwendet), dann muss der Konstruktorparameter von BraveKnight Questtyp sein. Zu diesem Zeitpunkt wird eine weitere Bohne in der Referenz übergeben, die die Referenz der Bohne mit dem Namen "Quest" oben ist. Zu diesem Zeitpunkt ist die Konstruktorinjektion von BraveKnight ebenfalls abgeschlossen-> <bean id = "Knight"> <constructor-arg ref = "quest"> </constructor-arg> </bean>Spring bietet Java-basierte Konfigurationen, die als Alternative zu XML verwendet werden können
/** Java-basierte Konfigurationsdatei implementiert die Montage von Objekten*Erstellt von Wung unter 2016/8/26. */ @ConfigurationPublic class KnightConfig {@Bean public Knight () {return New BraveKnight (Quest ()); } @Bean public quest quest () {return New Slaydragonquest (System.out); }}Die Effekte sind gleich und die spezifische Erklärung wird im nächsten Kapitel ausführlich beschrieben. Lassen Sie es uns erneut überprüfen. Es wurde gesagt, dass der Frühling die Abhängigkeiten zwischen Objekten automatisch verwalten wird. Was ist diese Art von Manager? Die Antwort ist der Anwendungskontext, bei dem es sich um einen Container für die Feder handelt, mit dem die Definitionen von Bohnen geladen und zusammengebaut werden können. Der Kontext der Frühlingsanwendung ist ausschließlich für die Erstellung und Montage von Objekten verantwortlich. Tatsächlich gibt es viele Möglichkeiten, den Unterschied zwischen diesem Kontext zu implementieren, nur den Unterschied in der Ladekonfiguration. Sehen wir uns eine Möglichkeit, die Konfiguration zu laden.
public class Knightmain {public static void main (String [] args) {AnnotationConFigApplicationContext context = new AnnotationConfigapplicationContext (KnightConfig.class); // Die Definition der Bean kann aus der Konfigurationsdatei erhalten werden. Knight Knight = context.getBean (Knight.Class); Knight.EmBarkonquest (); context.close (); }}Gesichtsschneiden auftragen
DI kann kollaborative Softwarekomponenten locker gekoppelt halten, während die Facettenprogrammierung es ermöglicht, Funktionen in der gesamten Anwendung zu trennen, um wiederverwendbare Komponenten zu bilden, und insbesondere eine Technologie, die Softwaresysteme für den Fokus vorantreibt. Was ist ein Fokus? Systemdienste wie Protokollierung, Transaktionsmanagement und Sicherheitsmanagement müssen häufig in andere Komponenten integriert werden, die selbst eine Geschäftslogik haben. Diese Systemdienste werden in der Regel als Überschneidungsfokus bezeichnet, da sie an mehreren Stellen wiederverwendet werden und mehrere Komponenten des Systems erstrecken. Einfach ausgedrückt, Sie extrahieren die Dienste, die aus verschiedenen anderen Komponenten wiederverwendet werden müssen, aber wie können Sie sie verwenden? In der Tat soll die Methode in die Orte eingefügt werden, die Sie bei der Verwendung verwenden müssen. Gemäß diesem Begriff "Abschnitt" sollte es jedoch ausgedrückt werden, um die wiederverwendete Komponente als Abschnitt zu extrahieren und den Abschnitt bei Bedarf durch die Komponente zu schneiden. Auf diese Weise müssen Kernanwendungen die Existenz dieser Abschnitte nicht kennen, und die Abschnitte integrieren keine Geschäftslogik in Kernanwendungen.
/** Eine Singer -Klasse wird verwendet, um die Ritter zu loben, dh den Rittern*, die von Wung am 2016/8/26 geschaffen wurden. */public class minstrel {private printstream stream; public minnstrel (printstream stream) {this.stream = stream; } // public void singbeforequest () {Stream.print ("begin"); } // public void singafterquest () {Stream.print ("End"); }} public class BraveKnight implements Knight{private Quest quest;private Minstrel minstrel;/** * BraveKnight does not create adventure types on its own, but passes adventure tasks as parameters in construction* This is one of the ways of dependency injection: constructor injection*/// public BraveKnight(Quest quest){// this.quest = quest;// }public BraveKnight(Quest quest, Minstrel minstrel) {this.quest = squest; this.minstrel = minstrel;} public void Emarkonquest () {minstrel.singbeforequest (); Quest.Embark (); minstrel.singaFterquest ();}}}}}}}}}}}}} Zu dieser Zeit begann der tapfere Ritter zu extrahieren, aber er stellte fest, dass es in seinen Pflichten nicht nur ein Risiko war, sondern jetzt musste er den Sänger verwalten, um ihn zu preisen, aber dies sollte nicht zur Kategorie gehören, die verwaltet werden sollte. Daher müssen wir mit der Idee der Abschnitte das Lobverhalten des Sängers extrahieren und ein Abschnitt werden. Bevor die Cavaliers das Risiko eingehen, wird dieser Abschnitt über die Singbeforequest -Methode geschnitten und die SingaFterquest -Methode nach dem Risiko ausführt. Dies wird also den Code erkennen, der vom Ritter nicht gelobt werden muss, und der Sänger existiert nicht im Objekt des Ritters. Er wird nicht nur den Ritter loben, sondern auch jemanden loben, solange andere diesen Abschnitt eingeben.
<!-bedeutet, dass die Konfiguration der Bean mit der obigen ID als Minstrel als Abschnitt den Sänger als Abschnitt konfiguriert-> Aspekt ref = "minstrel"> <!-Definiert den Einstiegspunkt, dh, wo man den Abschnitt Expression = "Ausführung verwenden soll ( * * * * .emBarkonquest (..)). Nach der Note-Ausführung vor und nach dem Einstiegspunkt-> </AOP: After> </AOP: Vor> </AOP: PointCut> </aoP: </aoP: config>
Die Situation ist, dass Minnesänger noch ein unabhängiges Pojo ist und der Kontext des Frühlings daraus einen Abschnitt gemacht hat. Das Wichtigste ist, dass der Ritter zu diesem Zeitpunkt keine Ahnung von der Existenz dieses Abschnitts hat. Dies ist nur eine kleine Kastanie, die tatsächlich viele wichtige Dinge tun kann.
Verwenden Sie Vorlagen, um den Stilcode zu beseitigen
Wenn wir JDBC verwenden, um auf die Datenbank zuzugreifen, um Daten abzufragen, erfordert der vollständige Prozess das Erstellen von Verbindungen, das Erstellen von Anweisungsobjekten, die Verarbeitungsergebnisse, Abfragen und Schließen verschiedener Verbindungen. Darüber hinaus werden verschiedene Ausnahmen erfasst, und dann erfordern Abfragen in verschiedenen Szenarien eine solche sorgfältige Wiederholung. JDBC ist nicht nur der einzige Fall, in dem es viel Stilcode gibt. SPRING zielt darauf ab, den Stilcode durch Vorlagenkapselung zu beseitigen, wie z. B. JDBCTEMPLATE von Spring.
Nehmen Sie Ihre Bohne auf
In federbasierten Anwendungen leben Ihre Anwendungsobjekte in Federcontainern, die für das Erstellen von Objekten zusammengestellt und ihre Lebenszyklen verwaltet werden. Was ist Frühlingsbehälter? Es gibt nicht nur eine Art von Behälter. Frühling wird mit mehreren Containerimplementierungen geliefert. Es ist in zwei Kategorien unterteilt: Bean -Fabriken, die die einfachsten Behälter sind, um grundlegende DI -Unterstützung zu bieten. Der Anwendungskontext ist relativ fortgeschritten und bietet Dienste auf Anwendungsrahmenebene. Meistens ist der Anwendungskontext beliebter.
Der Anwendungskontext ist auch in viele verschiedene Arten zum Laden von Konfigurationen unterteilt.
Verschiedene Frühlingsmerkmale
Zusammenfassen
Spring ist eine Framework -Technologie, die die Entwicklung vereinfachen kann, und der Kerninhalt ist DI und AOP.
Das obige ist der Klatsch über diesen Artikel - verstehen Sie den gesamten Inhalt von Spring nach und nach, ich hoffe, dass es für alle hilfreich sein wird. Interessierte Freunde können weiterhin auf diese Seite verweisen:
SpringMVC Erste Schritte Beispiel
Detaillierte Erklärung des Code
Spring Integrated Redis detailliertes Code Beispiel
Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen.