Dieser Artikel analysiert hauptsächlich das Designkonzept der Knochenarchitektur des Spring -Frameworks des Spring -Frameworks. Warum benötigen diese Komponenten diese Komponenten? Wie kombinieren sie sich zusammen zu Spring's Skeletal Architecture? Wie verwendet die AOP -Funktion von Spring diese grundlegenden Skelettarchitekturen, um zu arbeiten? Welche Designmodelle werden im Frühjahr verwendet, um dieses Design zu vervollständigen? Was ist seine Inspiration für dieses Designkonzept für unser zukünftiges Softwaredesign? Dieser Artikel beantwortet diese Fragen ausführlich.
Frühlings -Skelettarchitektur
Es gibt mehr als ein Dutzend Komponenten im Frühjahr, aber es gibt nur wenige echte Kernkomponenten.
Abbildung 1. Das Gesamtarchitekturdiagramm des Rahmens
Aus der obigen Abbildung ist ersichtlich, dass es im Spring -Framework nur drei Kernkomponenten gibt: Kern, Kontext und Bohnen. Sie bauen die gesamte Frühlings -Skelettarchitektur. Ohne sie ist es unmöglich, die Eigenschaften der oberen Schichten wie AOP und Web zu haben. Im Folgenden wird auch die Feder hauptsächlich aus diesen drei Komponenten analysiert.
Spring's Design Concept
Wie bereits erwähnt, werden die drei Kernkomponenten des Frühlings eingeführt. Bean ist der wahre Protagonist im Frühling.
Beans Rolle im Frühling ist genau wie die Bedeutung des Objekts. Genau wie eine Performance -Phase, aber es gibt keine Schauspieler. Warum ist die Rolle des Frühlings so wichtig? Verwaltet die Konfigurationsdatei, die sein Abhängigkeitsinjektionsmechanismus ist. Und diese Injektionsbeziehung wird in einem IOC -Behälter verwaltet, und was ist das Objekt des IOC -Behälters von Bean. Der Frühling ist der Zweck, diese Objekte und einige zusätzliche Vorgänge durch Verpacken von Objekten in Bean zu verwalten.
Die Designstrategie ähnelt dem Designkonzept von Java, um OOP zu implementieren. Diese Umgebung in dieser Umgebung gemäß bestimmten Regeln. Denken Sie darüber nach, denken Sie an die anderen Frameworks, die wir in einem großen ähnlichen Designkonzept verwenden.
Wie man mit Kernkomponenten zusammenarbeitet
Wie bereits erwähnt, ist Bean ein Schlüsselfaktor im Frühjahr. Wenn Sie ein Schauspieler in einer Leistung sind, ist der Kontext der Bühnenhintergrund dieser Leistung, und der Kern sollte die Requisiten der Leistung sein. Nur wenn sie zusammen sind, können sie den grundlegendsten Zustand haben, der eine gute Show ausführen kann. Natürlich können die grundlegendsten Bedingungen diese Leistung nicht hervorheben, und die Show, die er ausführt, ist ausreichend aufregend.
Wir wissen, dass Bean verpackt ist und Objekt Daten haben muss. sie und diese Beziehung aufrechtzuerhalten. Der Kontext ist also eine Sammlung von Bean -Beziehung. Wie nutzen die Kernkomponente? In der Tat sind Kern einige Spalten, die für die Beziehung zwischen jeder Bean erforderlich sind, um die Beziehung zwischen jeder Bean zu entdecken, zu etablieren und aufrechtzuerhalten.
Sie können durch die folgende Abbildung dargestellt werden:
Abbildung 2. Drei Komponentenbeziehungen
Detaillierte Erläuterung von Kernkomponenten
Hier werden wir die hierarchischen Beziehungen jeder Komponente im Detail sowie die Reihenfolge zur Laufzeit einführen. Wir sollten auf die Verwendung des Frühlings achten.
Bohnenkomponente
Die Bedeutung der Bohnenkomponente für den Frühling wurde früher erklärt. Bean -Komponenten werden unter Spring org.springFramework.Beans verpackt. Alle Kategorien unter diesem Paket lösen drei Dinge: Bean -Definition, Bean -Erstellung und Analyse von Bean. Für Frühlingsbenutzer ist das einzige, was sich für die Erstellung von Bohnen kümmern muss.
Das typische Fabrikmodell von Springbean wurde erstellt.
Abbildung 4. Die Erbschaftsbeziehung der thebeanischen Fabrik
Beanfactory hat drei Unterklassen: listableBeAnfactory, Hierarchicalbeanfactory und AutoWire -fähige Bohnenfabrik. Aus der obigen Abbildung können wir jedoch feststellen, dass die endgültige Standard -Implementierungsklasse standardlistableBeanFactory ist und alle Schnittstellen implementiert. Warum also so viele Grenzflächenstufen definieren? Schauen Sie sich den Quellcode und die Anweisungen dieser Schnittstellen an. Der Betriebsprozess. Beispielsweise zeigt die listableBeanFactory -Schnittstelle an, dass diese Bohnen aufgelistbar sind, und hierarchicalBeanFactory bedeutet, dass diese Bohnen Erbschaftsbeziehungen haben, dh jede Bohne hat eine Vaterbohne. Die automatische Schnittstelle von AutoWirecapelableBeArfactory definiert die automatischen Montageregeln von Bean. Diese vier Schnittstellen definieren gemeinsam die Sammlung von Bohnen, die Beziehung zwischen Bean und Bohnenverhalten.
Beans Definition enthält hauptsächlich Beandefinitionsbeschreibung.
Abbildung 5. Das hierarchische Beziehungsdiagramm definierte bybean
Die Definition von Bean ist eine vollständige Beschreibung aller Informationen in den Knoten, die Sie in der Konfigurationsdatei von Spring, einschließlich verschiedener Sub -Nodes, definiert. Als Spring erfolgreich einen von Ihnen definierten Knoten analysierte, wurde er innerhalb des Frühlings in ein BeanDefinition -Objekt umgewandelt. Alle Operationen werden in Zukunft für dieses Objekt ausgeführt.
Der Analyseprozess von Bean ist sehr kompliziert, und die Funktion ist in Details unterteilt, da hier viele Orte erweitert werden müssen, und sie müssen eine ausreichende Flexibilität sicherstellen, um mit möglichen Änderungen fertig zu werden. Die Bean -Analyse analysiert hauptsächlich die Federkonfigurationsdatei. Dieser Analyseprozess wird hauptsächlich in der Abbildung unten durch die Klasse abgeschlossen:
Abbildung 6. Analytische Klasse der Bean analytische Klasse
Natürlich gibt es auch eine spezielle Analyse des Tags.
Kontextkomponente
Der Kontext ist unter Spring org.springframework.context. Schauen wir uns an, wie diese Umgebung aufgebaut ist.
ApplicationContext ist die Top -übergeordnete Kontextklasse. Unten finden Sie das Strukturdiagramm des Kontextes:
Abbildung 7. Kontext -bezogene Klassenstrukturdiagramm
Aus der Abbildung oben ist der Anwendungscontext beanfaktorisch, was auch zeigt, dass das Hauptziel des Federbehälters eine Bean ist.
Die Unterklassen von ApplicationContext enthalten hauptsächlich zwei Aspekte:
ConfigurableApplicationContext gibt an, dass der Kontext, dh der Benutzer, die vorhandenen Konfigurationsinformationen im Kontext dynamisch hinzufügen oder ändern kann.
WebApplicationContext ist der Name des Namens, der für das Web vorbereitet ist.
Anschließend wird der Untergang die Art des Kontexts konstruieren, gefolgt von dem Weg zum Zugang zu Kontext. Eine solche Ebene der ersten Ebene stellt eine vollständige Kontextniveau dar.
Im Allgemeinen muss der ApplicationContext Folgendes vervollständigen:
◆ Machen Sie eine Anwendungsumgebung
◆ Verwenden Sie Beanfactory, um das Bean -Objekt zu erstellen
◆ Speichern Sie die Objektbeziehungstabelle
◆ kann verschiedene Ereignisse erfassen
Als Frühlings -IOC -Behälter integriert der Kontext im Grunde die meisten Funktionen des Frühlings oder ist die Grundlage für die meisten Funktionen.
Kernkomponente
Kernkomponenten als Kernkomponente des Frühlings enthalten viele wichtige Kategorien. Diese Möglichkeit, alle Ressourcen in eine Schnittstelle abstrahieren, ist es wert, im zukünftigen Design zu lernen. Schauen wir uns die Rolle dieses Teils im Frühling an.
Die folgende Abbildung ist das Strukturdiagramm, das sich auf ressourcenbezogene bezogen:
Abbildung 8.RSource -verwandte Klassenstrukturdiagramm
Aus der obigen Abbildung ist ersichtlich, dass die Ressourcenschnittstelle verschiedene mögliche Ressourcentypen zusammenfasst, dh der Unterschied im Dateityp ist für Benutzer blockiert. Für den Anbieter von Ressourcen ist auch ein Problem, wie die Ressourcenschnittstelle für andere Personen verwendet werden können. Auf diese Weise können alle Ressourcen über die InputStream -Klasse erhalten werden, sodass auch der Ressourcenanbieter abgeschirmt ist. Ein weiteres Problem ist, dass das Problem des Ladens von Ressourcen, dh der Lader der Ressourcen, aus der obigen Abbildung einheitlich sein muss. Die Schnittstelle kann alle Ressourcen laden, und seine Standardimplementierung ist der Defaultresourceloader.
Schauen wir uns an, wie Kontext und Ressourcen eine Beziehung aufgebaut haben? Schauen Sie sich zunächst das Diagramm ihrer Beziehung an:
Abbildung 9. Das Beziehungsdiagramm von Kontext und Ressource
Wie aus der obigen Abbildung erfolgt, verantwortlich der Kontext die Arbeit der Ressourcenklasse für die Vervollständigung der Ressourcenscheibe. Es gibt viele ähnliche Möglichkeiten zu Kernkomponenten.
Wie man im IOC -Behälter arbeitet
Wie bereits erwähnt, ist die Struktur und die gegenseitige Abhängigkeit von Kernkomponenten, Bean -Komponenten und Kontextkomponenten.
So erstellen Sie eine beanfaktorische Fabrik
Wie in Abbildung 2 beschrieben, ist der IOC -Container tatsächlich ein Bean -Relationship -Netzwerk, das mit den beiden anderen Komponenten kombiniert wird. Der gebaute Eingang befindet sich in der Aktualisierungsmethode der AbstractApplicationContext -Klasse. Der Code dieser Methode lautet wie folgt:
Liste 1.AbstractApplicationContext.refresh
Public void refresh () wirft Beansexception, illegalStateException {synchronisiert (this.startUpShutdownMonitor) {// Bereiten Sie diesen Kontext für die Aktualisierung vor. Kontext. Registrieren Sie die Bean -Verarbeitern, die beankten. Unterklasse. Catch (Beansexception Ex) {// Destroy ALRREAD SINGLETONEN, um Ressourcen zu vermeiden ().Diese Methode soll einen vollständigen Code für den gesamten IOC -Containerprozess erstellen und verstehen, dass jede Codezeile im Inneren die Prinzipien und Funktionen des meisten Frühlings grundsätzlich versteht.
Dieser Code enthält hauptsächlich solche Schritte:
◆ Erstellen Sie Beanfaktor in Ordnung
◆ Ereignis kann an der Registrierung interessiert sein
◆ Erstellen Sie ein Bean -Instanzobjekt
◆ Auslösen von Ereignissen, die sich anhören
Unten kombiniert mit der Codeanalyse dieser Prozesse.
Der zweite und dritte Satz besteht darin, die Beanfaktorie zu erstellen und zu konfigurieren. Dies ist aktualisiert, dh die Konfiguration aktualisieren. Im Folgenden ist der Methodencode zum Aktualisieren des Beanfaktoriums:
Liste 2. AbstractReFreshableApplicationContext
Geschützte void refreshbeanfactory () wirft Beansexception {if (hasBeanfactory ()) {Destrearbeans (); ;Diese Methode realisiert die abstrakte Methode der AbstractApplicationContext RefreshbeanFactory. Beachten Sie, dass die Arten von beanfaktorischen Objekten eine Vielzahl von Arten von Objekten haben. Das ursprüngliche Objekt von Beanfactory ist die Standardeinheit.
Abbildung 10. Vererbungsdiagramm der Vererbung der DefaultListableBeanFactory -Klasse
Zusätzlich zur Beanfaktor -bezogenen Klasse wurde festgestellt, dass sie auch mit dem Bohnenregister zusammenhängt. In der RefreshbeanFactory -Methode gibt es eine Linie von LoadbeanDefinitions (Beanfactory), die die Antwort findet. Behälter.
Dieser Prozess kann in der folgenden sequentiellen Karte erklärt werden:
Abbildung 11. Erstellen Sie das Zeitvorwort der Beanfaktor
Der Analyse und der Registrierungsprozess von Bean sind wie folgt:
Feige
Fügen Sie nach dem Erstellen des Beanfaktors einige Werkzeugkurse hinzu, die von der Frühling selbst benötigt werden.
Der nächste drei -Linien -Code in AbstractApplicationContext spielt eine wichtige Rolle bei der Expansion der Funktionsfunktion. Die ersten beiden Zeilen dürfen die Konfiguration des gebauten Beanfaktoriums jetzt ändern. Sie alle erweitern alle die Funktion des Frühlings, daher müssen wir lernen, diesen Teil der Verwendung von Feder zu verwenden.
Unter ihnen ist es in der Methode für invokeBeArtoryPostProcessors hauptsächlich Unterklassen zur Implementierung der BeanfactoryPostPostProcessor -Schnittstelle. Und führen Sie seine postprozessbeanfaktorische Methode aus, die Aussage dieser Methode lautet wie folgt:
Listing 3.BeanFactoryPostProcessor.POSTPROCESSBEANFACTORY
Void postProcessbeanFactory (configurablelistableBeAnfactory Beanfactory) löst Beansexception aus;
Die Parameter sind beanfaktorisch, was anhand von Beanfactory geändert werden kann. Daten.
Die RegisterBeanPostProcessors -Methode kann auch eine Unterklasse der Benutzerdefinition der BeanPostProcessor -Schnittstelle erhalten und sie in die BeanPostProcessors -Variable im Beanfactory -Objekt ausführen. Die beiden Methoden werden im BeanPostProcessor deklariert: Postprozessbeeritialisierung und Postprozessafterinilisierung werden zur Ausführung während der Initialisierung des Bean -Objekts verwendet. Kann benutzerdefinierte Operationen ausführen.
Der letztere Zeilencode ist die Registrierung der Initialisierung des Überwachungsereignisses und der anderen Hörer des Systems.
So erstellen Sie eine Bean -Instanz und bauen Sie das Beziehungsnetzwerk der Bean auf
Das Folgende ist der sofortige Bean -Code, der mit der Methode für die Finanzvereinheit von Finanzierung beginnt.
Listing 4.AbstractApplicationContext.finishbeanFactoryInitialization
Geschütztes void-Finanzierungspunkte (Konfigurieren Sie sich Lazy-init) Singletons.
Es kann festgestellt werden, dass die Instanz der Bean im Beanfaktor zu finden ist. Der Code der Preinstantiatesingletons -Methode lautet wie folgt:
Liste 5.DefaultListableBeanFactory.PreieinstantialSingletons
Public void preinstantiatesingletons () löscht Beansexception {if (this.logger.issinfoenabled ()) {this.logger.info ("Vorinstantiagierende Singletons in";} Synchronized (this.beandeFinitionmap) {for (string mentname: this: Dies. beandefinitionNames) {rootBeandefinition BD = getMergedLocalbeandefinition (Beanname); if (! Bd.isabstract () &&ISSINGLEON () &&! ()) {if (IsfactoryBean (Beanname)) {Final FactoryBean Factory = (FactoryBean) GetBean (Factory_bean_prefix+ Beanname); Boolean IseAgerinit; if (System.GetSecurityManager ()! IiseAnerit (); ;}}}}}}}}}Hier gibt es eine sehr wichtige Bean -faktorisch. Es kann die Methode zur Generierung eines Instanzobjekts definieren, solange seine GETObject -Methode implementiert wird. Das Instanzobjekt dieser Bean innerhalb der Spring ist jedoch FactoryBean. Das Objekt von Spring, die die Fabrikbekleidung selbst erhält, wird mit & abgeschlossenen Fertigstellungen abgeschlossen.
So erstellen Sie ein Instanzobjekt der Bean und wie Sie einen Kernschlüssel in der zugehörigen Beziehung zwischen den Bean -Instanzobjekten erstellen, ist das Folgende der Flussdiagramm dieses Prozesses.
Abbildung 13.Bean Instance Creation Flow Diagramm
Wenn es sich um eine gewöhnliche Bohne handelt, schafft er seine Instanz direkt, indem er die GetBean -Methode aufruft. Das Folgende ist die Zeit -Sequenz -Karte des Erstellens einer Bean -Instanz:
Abbildung 14.Bean Instance Creation Sequential Diagramm
Ein weiterer sehr wichtiger Teil besteht darin, die Beziehung zwischen den Bean -Objekt -Instanzen zu ermitteln.
Abbildung 15. Einrichtung von Objektbeziehungen
Expansionspunkt des IOC -Behälters
Ein weiteres Problem ist, wie diese Bean -Objekte eine gewisse Erweiterbarkeit aufweisen, dh einige Operationen können hinzugefügt werden. Was sind die Erweiterungen? Wie nennt der Frühling diese Erweiterungen?
Für den IOC -Behälter von Spring gibt es so viele. BeanfactoryPostProcessor, BeanpostProcessor. Sie werden aufgerufen, wenn sie Beanfaktor- und Gebäude -Bohnenobjekte erstellen. Es gibt Initialisierungsbekleidung und Einwegbetriebe. Benutzer können die in diesen Schnittstellen definierte Methode implementieren, und der Frühling ruft sie zu einem angemessenen Zeitpunkt auf. Ein anderer ist FactoryBean.
In diesen Expansionspunkten werden in der Regel Frühlingszwecke erledigt. . Sie können die folgende Metapher verwenden, um zu erklären.
Wir vergleichen den IOC -Behälter mit einer Box. Dann ist ihre entsprechende Beziehung Beanfactory das Maschinenmodell, der Ballmodus ist eine Bohne und der Ball des Ballmodus ist die Instanz der Bohne. Wo sind die Erweiterungen früher? BeanfactoryPostProcessor entspricht der Schaffung eines Ballmodells, und Sie haben die Möglichkeit, eine Korrektur davon vorzunehmen, dh er kann Ihnen helfen, den Ballmodus zu ändern. Die Initialisierungsbean und Einwegbetriebe befinden sich am Anfang und am Ende der Ballmodelle, und Sie können einige Vorbereitungen und Tailing -Arbeiten erledigen. Mit BeanPostProcessor können Sie entsprechende Korrekturen im Ballmodus vornehmen. Schließlich gibt es eine Fabrikbeküle, die ein magisches Ballmodell ist. Dieser Ballmodus ist nicht im Voraus, aber Sie werden seine Form für ihn bestimmen. die Bälle, die Sie wollen
So verwenden Sie den IOC -Behälter für mich
Die vorherige Einführung des Konstruktionsprozesses des Frühlingsbehälters, was kann Frühling für uns tun und was kann der IOC -Container des Frühlings tun? Wir müssen zuerst einen IOC -Container mit Spring erstellen.
IOC baut tatsächlich einen Rubik -Würfel für Sie auf. Wie nehmen wir teil? Dies ist, was ich früher gesagt habe, um einige Erweiterungen im Frühjahr zu verstehen, und wir ändern das gemeinsame Verhalten des Frühlings, indem wir diese erweiterten Punkte erreichen. Wie Sie die gewünschten Persönlichkeitsergebnisse erzielen, gibt es in den Frühlingszweigen viele Beispiele. als Referenz verwendet.
Detaillierte Erläuterung von AOP -Funktionen im Frühjahr
Das Prinzip der Umsetzung des dynamischen Proxy
Um die AOP von Spring zu verstehen, muss das Prinzip der dynamischen Agentur zuerst verstanden werden, da AOP auf der Grundlage dynamischer Proxy implementiert wird. Der dynamische Agent muss mit JDK selbst beginnen.
Es gibt eine Proxy -Klasse unter Java.lang.Rang.Reflet -Paket von JDK, das der Eingang zur Agenturklasse ist. Die Struktur dieser Klasse:
Abbildung 16.Proxy -Strukturstruktur
Aus dem Bild oben sind die vier öffentliche Methoden. Die letzte Methode NewProxyInstance ist die Methode zum Erstellen von Proxy -Objekten. Der Quellcode dieser Methode lautet wie folgt:
Liste 6.Proxy.NewProxyInstance
Public statisches Objekt NewProxyInstance (Classloader Loader, Klasse> [] Schnittstellen, InvocatchHandler H) löst IllegalAGumentException aus {if (h == null) {th row neue nullpointerexception (); = cl.getConstructor (Konstruktorparams); );} Catch (InstantiationException e) {Neues Internet werfen (e.toString ());} neues Internet (e.ToString ());}}Diese Methode erfordert drei Parameter: Classloader, mit denen die Proxy -Klasse -Loader -Klasse geladen wird. Schnittstellen sind diese Schnittstellen, die dargestellt werden müssen. InvocationHandler, es wird verwendet, um den Betrieb von Benutzern auszuführen, die von Benutzern zusätzlich zu den Methoden in der Proxy -Schnittstelle angepasst werden. Der Benutzer ruft die Zielmethode auf, wird durch die eindeutige Methode dargestellt, die in der InvacationHandler -Klasse aufgerufen wird. Dies wird später ausführlich erklärt.
Mal sehen, wie der Proxy die Proxy -Klasse produziert. Es wird unten bekannt gegeben.
Abbildung 17. Erstellen Sie Proxy -Objekte
In der Tat ist aus der obigen Abbildung zu finden, dass sich die Agentenklasse in der Methode der Generationsproxyklasse des Proxygenerators befindet. Die Proxygientor -Klasse ist unter sun.misc eingewickelt.
Wenn es eine solche Schnittstelle gibt, wie folgt:
Liste 7. SimpleProxy -Klasse
öffentliche Schnittstelle SimpleProxy {public void Sizemethod1 ();Die vom Agent erzeugte Klassenstruktur lautet wie folgt:
Liste 8. $ Proxy2 Klasse
Öffentliche Klasse $ proxy2 erweitert Java.Lang.Rang.reflect.Proxy implementiert SimpleProxy. Methode M3;
Die Methode in dieser Klasse ruft die Invoke -Methode des InvocationHandlers auf, und jede Methode entspricht einer Eigenschaftsvariablen. So wird der gesamte Agent realisiert.
Wie man Springaop erreicht
Aus dem Prinzip des vorherigen Agenten wissen wir, dass der Zweck des Proxy darin besteht, dass wir, wenn die Zielmethode aufgerufen wird .
Die AOP -Implementierung von Spring ist eine Vereinbarung zur Einhaltung der AOP -Allianz. Gleichzeitig hat die Spring es erweitert und einige Schnittstellen wie Pointcut und Berater hinzugefügt, um es flexibler zu gestalten.
Unten finden Sie ein Klassendiagramm des JDK Dynamic Proxy:
Abbildung 18.JDK Dynamic Proxy Class Diagramm
Das obige Bild zeigt deutlich die Schnittstelle, die durch die AOP -Allianz -Definition definiert ist. Lassen Sie uns nicht diskutieren, wie der Frühling die AOP -Allianz erweitert.
Liste 9. Konfigurieren Sie Proxy Bean
<bean id = "testbeanesingleton"> <Eigenschaft name = "proxyInterfaces"> <wert> org.springframework.ap.Framework.Prototypetts $ testBean Value> p rperty> <Eigenschaft name = "Ziel"> <Ref Lokal = "testbeanTarget" " > Ref> Eigenschaft> <Eigenschaft name = "Singleton"> <wert> trueValue> Eigenschaft> <Eigenschaft name = "interceptors"> <list> <Wert> testInterceptorValue> <Val ue> testInterceptor2Value> liste> Eigenschaft> Bean> Bean>
In der Konfiguration siehe die Schnittstelle des Agenten, die Implementierungsklasse der Schnittstelle ist die Zielklasse, und der Interceptor wird vor der Ausführung der Zielmethode aufgerufen. Wesen
Lassen Sie uns sehen, wie Spring den Agenten abschließt und wie der Interceptor aufruft.
Wie bereits erwähnt, erreicht der Frühlings -AOP auch einen eigenen Expansionspunkt, um diese Funktion aus dieser Proxy -Klasse zu vervollständigen. Natürlich sollte das Proxy -Objekt über die Proxy -Klasse dynamisch generiert werden.
Das Folgende ist das Timing -Diagramm des von Spring erstellten Proxy -Objekts:
Abbildung 19. Die Entstehung des Objektobjekts
Nachdem Spring ein Proxy -Objekt erstellt hat, werden Sie bei der Aufruf der Methode im Zielobjekt in der zuvor erklärten Invoke -Methode der IncvocationHandler -Klasse dargestellt. Hier implementiert die JDKDYNAMICAPPROXY -Klasse die InvocationHandler -Schnittstelle.
Schauen wir uns an, wie der Frühling den Interceptor nennt.
Abbildung 20.spring ruft den Interceptor auf
Das obige ist der JDK -Dynamik -Agent.
Designmodusanalyse im Frühjahr
Es gibt auch viele Entwurfsmuster, die im Frühjahr verwendet werden, z. bereits eingeführt. Hier stellen wir hauptsächlich den Agenturmodus und den Strategiemodus vor.
Proxy -Modus
Proxy -Modus -Prinzip
Der Proxy -Modus besteht darin, ein Proxy -Objekt für ein bestimmtes Objekt zu erstellen, und das Proxy -Objekt steuert den Verweis auf das ursprüngliche Objekt, und die Erstellung dieses Proxy -Objekts kann dem ursprünglichen Objekt einige zusätzliche Operationen hinzufügen. Unten finden Sie die Struktur des Proxy -Modus:
Abbildung 21. Die Struktur des Proxy -Modus
Betreff: Abstraktes Thema, es ist eine Schnittstelle, die das eigentliche Objekt des Agentenobjekts zu realisieren.
ProxySubject: Zusätzlich zur Schnittstelle der Definition abstrakter Themen muss die Proxy -Klasse auch eine Referenz des Agentenobjekts enthalten
RealSubject: Die Klasse des Agenten ist das Zielobjekt.
So implementieren Sie den Proxy -Modus im Frühjahr
Der JDK Dynamic Agent im Frühjahr AOP wird mithilfe der Agenturmodus -Technologie erreicht. Neben der Schnittstelle des Proxy -Objekts im Frühjahr gibt es auch org.springframework.aop.springproxy und org.springframework.apork.advise. Der Konstruktor der Verwendung des Proxy -Modus in der Feder ist wie folgt:
Abbildung 22. Das Strukturdiagramm des Proxy -Modus wird in der Verkabelung verwendet
$ Proxy ist das erstellte Proxy -Objekt, und das Subjekt ist ein abstraktes Thema, und das Proxy -Objekt besteht darin, einen Verweis auf das Zielobjekt über InvocationHandler zu halten.
Eine echte Proxy -Objektstruktur im Frühjahr lautet wie folgt:
Listen Sie 10 Proxy -Objekt $ proxy4 auf
Öffentliche Klasse $ proxy4 erweitert Java.lang.reflect.proxy implementiert org.springframework.ap.Framework.Prototypetts $ testbean Work Reflect.Method M9; .Method M26; java.lang.reflect.Method M6; java.lang.reflect.method m28; java.lang.reflethod m14; java.lang. Reflect.method m12; java . Lang.reflet.Method M27; java.lang .reflect.method m11; java.lang.reflect.method m22; java.lang.reflect.Method m3; java.lang.reflect.Method java.lang.reflect. Method m4; java.lang.reflet.method m19; java .lang.reflect.Method M7; java.lang.reflet.method m15; java.lang.reflet.method m20; left.Method M10; java. LANG.Reflect.Method M1; java.lang.reflect.Method M17; java .lang.reflect.Method M21; java.lang.reflect.Method m0; ava.lang.reflet.method m24; int HashCode (); int indexof (org.SpringFramework.aop.advisor); int interxof (org.aopalliance. aip.advice); ject); java.lang.string tostring (); void sayhello (); void dosomething (); void dosometHing2 (); java.lang.class getProxiedIndIndIndIndIndIndIRFACES (); ProxytargetClass (); Org.SpringFramework.aop .advisor; getadvisors (); void addvisor (int, org.springframework.aip.advisor) Throws org.SpringFramework.aP.framework.aPConfigeXception; void addadvisor (ORG.Sprin gframework.aop.advisor) Throws org.SpringFramework.aop. framework.aPConfigeXception; void SetTargetsource (ORG .springframework.aop.targetsource); ORG.SpringFramework.aop.Targetsource GetTARGETSource (); d (); Boolean IsinterfaceProxied (java.lang.class); Boolean Removeadvisor (org.SpringFramework.aP. advisor );; Boolean SOR, ORG.SpringFramework.aP.Advisor) Throws org.SpringFramework.aop.framework.aPConfigeXception; void addAdvice (ORG.AOPALLIANCE.AOP.ADVICE) Throws org.SpringFramework.aP.framework.aPConfigexception; void addvice (int, org.aopalliance.aop.advic e) Throws org.Springframework.aP.framework.aPConfigeXception; .aop.advice); java.lang.string toproxyconfigstring (); Boolean isfrozen (); void setexposeProxy (Boolean);
策略模式
策略模式原理
The strategy model, as the name suggests, is a strategy to do something. This usually means that there may be multiple methods to complete a certain operation in programming. These methods may have different occasions and may have different adaptation. However, these methods may verwendet werden.各一个操作方法都当作一个实现策略,使用者可能根据需要选择合适的策略。
下面是策略模式的结构:
图23.策略模式的结构
Context:使用不同策略的环境,它可以根据自身的条件选择不同的策略实现类来完成所要的操作。它持有一个策略实例的引用。创建具体策略对象的方法也可以由他完成。
◆Strategy:抽象策略,定义每个策略都要实现的策略方法
◆ConcreteStrategy:具体策略实现类,实现抽象策略中定义的策略方法
◆Spring中策略模式的实现
◆Spring中策略模式使用有多个地方,如Bean定义对象的创建以及代理对象的创建等。这里主要看一下代理对象创建的策略模式的实现。
前面已经了解Spring的代理方式有两个Jdk动态代理和CGLIB代理。这两个代理方式的使用正是使用了策略模式。它的结构图如下所示:
图24.Spring中策略模式结构图
在上面结构图中与标准的策略模式结构稍微有点不同,这里抽象策略是AopProxy接口,Cglib2AopProxy和JdkDynamicAopProxy分别代表两种策略的实现方式,ProxyFactoryBean就是代表Context角色,它根据条件选择使用Jdk代理方式还是CGLIB方式,而另外三个类主要是来负责创建具体策略对象,ProxyFactoryBean是通过依赖的方法来关联具体策略对象的,它是通过调用策略对象的getProxy (ClassLoaderclassLoader)方法来完成操作。
Zusammenfassen
本文通过从Spring的几个核心组件入手,试图找出构建Spring框架的骨骼架构,进而分析Spring在设计的一些设计理念,是否从中找出一些好的设计思想,对我们以后程序设计能提供一些思路。接着再详细分析了Spring中是如何实现这些理念的,以及在设计模式上是如何使用的。