Kürzlich habe ich dieses Frühling einführende Buch: SpringInaction gekauft. Ich stöberte grob und fühlte mich ziemlich gut. Nur ein bisschen anfangen. Mannings Bücher sind immer noch gut. Obwohl ich mich nicht darauf konzentriere, wie diejenigen, die Manning -Bücher lesen, nicht auf Manning konzentriere, las ich es mit Ehrfurcht und Leidenschaft durch. Noch einmal habe ich die Kernkonzepte des Frühlings wie IOC, DI und AOP akzeptiert. Lassen Sie mich zuerst über meine Meinung zu IOC und DI sprechen.
IOC (DI): Tatsächlich ist das Konzept der Kernarchitektur nicht so kompliziert und es ist nicht so dunkel wie in einigen Büchern beschrieben. Java -Programmierer wissen, dass jede Geschäftslogik in einem Java -Programm mindestens zwei oder mehr Objekte zur Zusammenarbeit erfordert. Wenn jedes Objekt sein Partnerobjekt verwendet, muss es im Allgemeinen eine Syntax wie NewObject () verwenden, um die Anwendungsarbeit des Partnerobjekts abzuschließen. Sie werden feststellen, dass die Kopplung zwischen Objekten hoch ist. Die Idee von IOC ist: Frühlingsbehälter, um die Schöpfung und Koordination dieser voneinander abhängigen Objekte zu erkennen. Objekte müssen nur eine Beziehungsgeschäftslogik selbst haben. In dieser Hinsicht wird die Verantwortung dafür, wie ein Objekt sein kollaboratives Objekt erhält, umgekehrt (IOC, DI).
Dies ist meine Erfahrung mit dem IOC des Frühlings. DI ist eigentlich eine andere Art, IOC zu sagen. DI wurde erstmals Anfang 2004 von Martin Fowler in einer Zeitung vorgeschlagen. Er schloss: Was ist die Kontrolle umgekehrt? Das heißt: Die Art und Weise, abhängige Objekte zu erhalten, ist umgekehrt.
Wenn Sie dieses Kernkonzept noch nicht verstehen: Hier zitieren wir eine einfache und leicht verständliche Antwort in einem Blog namens Bromon:
IOC und di
Erstens möchte ich über IOC (InversionofControl, Kontrollinversion) sprechen. Dies ist der Kern des Frühlings. Für das Frühlingsgerüst ist die Spring für die Kontrolle des Lebenszyklus eines Objekts und der Beziehung zwischen Objekten verantwortlich. Was bedeutet das? Um ein einfaches Beispiel zu geben, wie finden wir eine Freundin? Eine häufige Situation ist, dass wir überall hingehen, um zu sehen, wo wir schöne und gut aussehende Frauen haben, und uns dann nach ihren Interessen, QQ-Nummern, Telefonnummern, IP-Nummern und IQ-Zahlen zu erkundigen. Finden Sie Wege, sie kennenzulernen, geben ihnen das, was sie mögen, und dann ... dieser Prozess ist komplex und tiefgreifend und wir müssen sich auf jeden Verknüpfung stellen. Gleiches gilt für die traditionelle Programmentwicklung. Wenn Sie in einem Objekt ein anderes Objekt verwenden möchten, müssen Sie es erhalten (neu für Sie selbst oder eine von JNDI abfragen). Nach dem Gebrauch muss das Objekt zerstört werden (z. B. Verbindung usw.), und das Objekt wird immer mit anderen Schnittstellen oder Klassen kombiniert.
Wie macht IOC das? Es ist ein bisschen so, als würde man eine Freundin durch eine Eheagentur finden und einen Dritten zwischen mir und meiner Freundin vorstellen: eine Eheagentur. Die Eheagentur verwaltet viele Informationen über Männer und Frauen. Ich kann der Eheagentur eine Liste zur Verfügung stellen und sagen, welche Art von Freundin ich finden möchte, z. Dann wird die Eheagentur einen MM entsprechend unseren Anforderungen anbieten. Wir müssen uns nur verlieben und heiraten. Es ist einfach und klar. Wenn die uns uns gegebenen Kandidaten den Anforderungen nicht erfüllen, werden wir eine Ausnahme auslegen. Der gesamte Prozess wird nicht mehr von mir kontrolliert, sondern von einer Container-ähnlichen Institution wie einer Eheagentur kontrolliert. Dies ist die vom Frühjahr befürwortete Entwicklungsmethode. Alle Klassen werden im Frühjahrsbehälter registriert, um Spring zu sagen, was Sie sind und was Sie brauchen. Dann gibt Ihnen Spring Ihnen das, was Sie wollen, wenn das System auf die entsprechende Ebene läuft, und übergeben Sie gleichzeitig anderen Dingen, die Sie brauchen. Alle Klassen werden durch den Frühling erstellt und zerstört, was bedeutet, dass das Objekt, das den Lebenszyklus eines Objekts steuert, nicht mehr das Objekt ist, das es bezieht, sondern den Frühling. Für ein bestimmtes Objekt wurde es zur Steuerung anderer Objekte verwendet, aber jetzt werden alle Objekte durch Feder gesteuert, so dass dies als Kontrollinversion bezeichnet wird.
Einer der wichtigsten Punkte von IOC ist die dynamische Bereitstellung eines Objekts mit anderen Objekten, die es während des Systembetriebs benötigt. Dies wird durch DI (Abhängigkeitsinjektion) erreicht. Zum Beispiel muss Objekt A die Datenbank bedienen. In der Vergangenheit haben wir immer Code in A geschrieben, um ein Verbindungsobjekt zu erhalten. Mit der Feder müssen wir die Feder nur mitteilen, dass in A eine Verbindung benötigt wird, um diese Verbindung zu konstruieren und wann sie sie konstruieren sollen, muss A nicht wissen. Wenn das System ausgeführt wird, stellt die Feder zum richtigen Zeitpunkt eine Verbindung her und injiziert es dann in eine wie eine Injektion, wodurch die Kontrolle der Beziehung zwischen jedem Objekt abgeschlossen wird. A muss sich auf die Verbindung verlassen, um normal zu laufen, und diese Verbindung wird durch Frühjahr in eine Feder injiziert, und der Name der Abhängigkeitsinjektion kommt davon. Wie wird DI implementiert? Eine wichtige Funktion nach Java 1.3 ist die Reflexion, mit der das Programm Objekte dynamisch generieren, Objektmethoden ausführen und die Eigenschaften von Objekten beim Ausführen ändern können. Die Frühling wird durch Reflexion injiziert. Verwandte Informationen zur Reflexion finden Sie in Javadoc.
Nach dem Verständnis der Konzepte von IOC und DI wird alles einfach und klar, und der Rest der Arbeit besteht darin, Blöcke im Frühlingsrahmen zu stapeln.
Lassen Sie uns erfahren, wie der Frühling funktioniert.
public static void main (string [] args) {applicationContext context = new FileSystemXMLApplicationContext ("ApplicationContext.xml"); Animal Animal = (Tier) Kontext.getbean ("Tier"); Animal.Say (); }Sie müssen mit diesem Code vertraut sein, aber lassen Sie ihn analysieren. Zunächst applicationContext.xml
<bean id = "Animal"> <Eigenschaft name = "name" value = "kitty" /> < /bean>
Er hat eine Klasse phz.springframework.test.cat
öffentliche Klasse Cat implementiert Animal {privater String -Name; public void sagt () {System.out.println ("Ich bin" + name + "!");} public void setName (String name) {this.name = name;}}Implementierte die Schnittstelle von phz.springframework.test.Animal
public interface Animal {public void sagt (); }Offensichtlich gibt der obige Code iamkitty aus!
Wie macht der Frühling das?
Schreiben wir als nächstes einen Frühling selbst, um zu sehen, wie der Frühling funktioniert!
Zunächst definieren wir eine Bohnenklasse, die zum Speichern von Immobilien von einer Bohne verwendet wird
/ * Bean -ID */ private String -ID; / * Bean -Klasse */ privater String -Typ; / * Beaneigenschaft */ private map <String, Objekt> Eigenschaften = new HashMap <String, Object> ();
Eine Bohne enthält ID, Typ und Eigenschaften.
Nächstes Frühjahr beginnt mit dem Laden unserer Konfigurationsdatei und speichert die Konfigurationsinformationen in einem HashMap. Der Schlüssel von HashMap ist die ID der Bean und der Wert von Hasmap ist die Bohne. Nur auf diese Weise können wir die Tierklasse über den Kontext erhalten. Wir alle wissen, dass Spirng Grundtypen injizieren und Typen wie Liste und Karte injizieren kann. Nehmen wir als Beispiel als Beispiel, um zu sehen, wie der Frühling gespeichert wird
Die Kartenkonfiguration kann der folgenden sein
<bean id = "test"> <Eigenschaft name = "testmap"> <map> <Eintragsschlüssel = "A"> <wert> 1 </value> </Eintrag
Wie speichert Spring die obige Konfiguration? Der Code ist wie folgt:
if (beanproperty.element ("map")! Element PropertiesListMap = (Element) BeanProperty.elements (). Get (0); Iterator <?> Propertiesiterator = propertiesListmap.elements (). Iterator (); while (propertiesiterator.hasnext ()) {Element Vet = (Element) Propertiesiterator.Next (); if (vet.getName (). Equals ("Eintrag") {String key = vet.attributeValue ("key"); Iterator <?> Valusiterator = vet.elements (). Iterator (); while (valusiterator.hasNext ()) {Element value = (Element) valusiterator.next (); if (value.getName (). Equals ("value")) {PropertiesMap.put (Schlüssel, value.getText ()); } if (value.getName (). Equals ("Ref") {PropertiesMap.put (Schlüssel, neuer String [] {value.attributeValue ("bean")}); }}}} bean.getProperties (). Put (Name, PropertiesMap); }Als nächstes gehen wir zum Kernteil. Mal sehen, wie Frühling die Abhängigkeitsinjektion ist. Tatsächlich ist auch die Idee der Abhängigkeitsinjektion sehr einfach. Es wird durch den Reflexionsmechanismus implementiert. Bei der Instanziierung einer Klasse injiziert sie die in HashMap gespeicherten Klassenattribute in die Klasse, indem die festgelegte Methode in der Klasse reflektiert wird. Mal sehen, wie es gemacht wird.
Zuerst eine Klasse wie diese instanziiert
öffentliches statisches Objekt NewInstance (String ClassName) {class <?> cls = null; Objekt obj = null; try {cls = class.forname (className); obj = clswinstance ();} catch (classNotfoundException e) {throwTimeexception (e); (IllegalAccessException e) {neue runTimeexception (e);} return obj;}Dann injiziert es die Abhängigkeiten dieser Klasse wie diese
public static void setProperty (Objekt OBJ, String -Name, String -Wert) {Klasse <? erweitert Objekt> clazz = obj.getClass (); try {String methodName = returnSetTtMThodName (Name); methode [] ms = clazz.getMethods (); für (Methode m: ms) {if (m.getName (). Equals (methodName) {if (m.getParametertypes (). Länge (). M.GetParameterTypes () [0]; setFieldValue (clazzparameterType.getName (), value, m, obj); break;}}}} catch (SecurityException E) {Wurf New RunTimeexception (e);} catch (illegalaNceptionException E). RunTimeException (e);}}Schließlich gibt es uns eine Instanz dieser Klasse zurück und wir können sie verwenden. Nehmen wir Map als Beispiel, um zu sehen, wie es gemacht wird. Der Code, den ich geschrieben habe
if (value Instanceof map) {iterator <?> EntryIterator = ((map <?,?>). Karte <String, Objekt> map = new HashMap <String, Object> (); while (EntryIterator.hasNext ()) {Eintrag <?,?> Eintragsmap = (Eintrag <?,?>) EntryInerator.Next (); if (EntryMap.getValue () InstanceOf String []) {map.put ((String) EntryMap.getKey (), getBean (((String []) Eintriebsmap.getValue ()) [0])); }} BeanProcesser.setProperty (OBJ, Eigenschaft, Karte); }Ok, wir können Spring verwenden, um die Klasse für uns zu erstellen. Ist es nicht schwierig? Natürlich kann der Frühling mehr als das tun. Dieses Beispielprogramm bietet nur einen Teil der Kerneinspritzfunktion des Frühjahrs.
Dieser Artikel hat auf eine große Anzahl von Artikeln verwiesen und kann Ihnen nacheinander nicht danken. Danke hier zusammen. Ich entschuldige mich für Ihre Urheberrechtsverletzung. Ich hoffe, es wird für alle hilfreich sein!
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels über die detaillierte Erklärung der Frühlings -IOC -Prinzipien, und ich hoffe, dass es für alle hilfreich sein wird. Interessierte Freunde können weiterhin auf diese Seite verweisen:
Ein kurzes Verständnis der Beispiele von Spring IOC, AOP und Code
Detaillierte Einführung in die Implementierung der IOC -Simulation von Spring
Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!