0. Auspunkt AOP
Aspektorientierte Programmierung (AOP) ist ein heißes Thema in der Softwareentwicklung und ein wichtiger Bestandteil des Spring -Frameworks. Die verschiedenen Teile der Geschäftslogik können durch Verwendung von AOP isoliert werden, wodurch die Kopplung zwischen den verschiedenen Teilen der Geschäftslogik, die Wiederverwendbarkeit des Programms verbessert und die Effizienz der Entwicklung verbessert wird.
AOP ist eine Fortsetzung von OOP.
Die Hauptfunktionen sind: Protokollierung, Leistungsstatistik, Sicherheitskontrolle, Transaktionsverarbeitung, Ausnahmebehandlung usw.
Die Hauptabsicht besteht darin, die Codes wie Protokollierung, Leistungsstatistiken, Sicherheitskontrolle, Transaktionsverarbeitung, Ausnahmebehandlung usw. aus dem Geschäftslogikcode zu teilen. Durch die Trennung dieser Verhaltensweisen hoffen wir, sie in nicht adreitierende Geschäftslogikmethoden zu unterteilen und diese Verhaltensweisen zu ändern, ohne den Geschäftslogikcode zu beeinflussen.
Eine Technologie, die Funktionen dynamisch zu Programmen hinzufügt, ohne den Quellcode zu ändern, kann durch Vorkompilierungsmethoden und dynamisches Proxying während der Laufzeit erreicht werden. AOP ist tatsächlich eine Fortsetzung des GOF -Designmodells. Das Entwurfsmodell verfolgt die Entkopplung zwischen dem Anrufer und dem Callee und verbessert die Flexibilität und Skalierbarkeit des Codes. AOP kann als Umsetzung dieses Ziels sein.
Bietet eine umfassende Unterstützung für die Aspekt-orientierte Programmierung im Frühjahr und ermöglicht eine kohärente Entwicklung, indem die Geschäftslogik der Anwendung von Diensten auf Systemebene wie Prüfung und Transaktionsmanagement getrennt wird. Anwendungsobjekte implementieren nur das, was sie tun sollten - vollständige Geschäftslogik - das. Sie sind nicht verantwortungsbewusst (oder haben sogar andere Bedenken auf Systemebene bewusst, wie z. B. Protokollierung oder Transaktionsunterstützung.
1. Laden Sie andere externe Konfigurationsdateien oder Eigenschaftsdateien in Spring über PropertyplaceholderConFigurer:
In vielen Javaee -Projekten ist die Rolle des Frühlings sehr wichtig. Es handelt sich um einen leichten Behälter, der andere Module und Komponenten verwaltet. Frühling muss häufig Streben, Ibatis, Winterschlaf usw. verwalten. Die Konfigurationsdateien dieser Open -Source -Frameworks werden in Spring über das PropertyPlaPlaPhOrconFigurer von Spring für die Verwaltung geladen. Darüber hinaus können Datenbankverbindungsinformationen, Eigenschaftsdateien von JNDI -Verbindungsinformationen usw. auch über PropertyPlacePlaTeholderConFigurer für die Verwaltung in Spring geladen werden. Die Verwendung ist wie folgt:
(1). Laden Sie andere Dateien in Spring über PropertyPlaceHoldConFigurer:
Fügen Sie die folgende Konfiguration in der Feder -Konfigurationsdatei hinzu:
<bean class = "org.springFramework.bean.factory.config.propertyPlaPleholderConFigurer"> <Property name = "Standorte"> <wert> classPath: Dateiname zum Laden </value>… </property> </bean>
(2). Die Konfiguration oder Attributdatei, die über die Konfiguration in (1) geladen werden soll, wird in die Feder geladen. Wenn Sie auch einige Informationen zur geladenen Konfiguration oder Datendatei zur Laufzeit verwenden müssen, z.
<bean id = ”dataSource” zerstören-method = ”class =” org.apache.common.dbcp.basicdataSource ”> <!-Angenommen, die Datenbankverbindungsinformationen sind in einer externen Eigenschaftsdatei geschrieben und wurden durch Spring-> <Eigenschaftsname =" DriverClassname "Value =" $ {Treiber} "}"/> < value = ”$ {url}”/> <Eigenschaft name = ”username” value = ”$ {userername}}”/> <Eigenschaft name = ”password” value = ”$ {password}”/> </bean>
HINWEIS: Sie können auch <Kontext: Property-PlaceholderLocation = "ClassPath: Dateiname zum Laden"/> verwenden
2. Dynamischer Proxy für Java:
Das zugrunde liegende Implementierungsprinzip von Spring ist ein dynamischer Proxy. Sie müssen daher zunächst dynamischen Proxy verstehen, bevor Sie eine Aspekt-orientierte Programmierung lernt.
Dynamic proxy is widely used in Java, and dynamic proxy is one of the classic design patterns that are very commonly used in the design patterns in 23. The principle of dynamic proxy is that when a target object or its method is to be called, the system does not directly return the target object, but returns a proxy object, and accesses the target object or method of the target object through this proxy object.
Das einfache Prinzip des dynamischen Proxys lautet wie folgt:
Client Caller -> Proxy -Objekt -> Ziellobjekt aufgerufen.
Wenn der Client das Proxy -Objekt aufruft, delegiert das Proxy -Objekt das Zielobjekt, um seine Geschäftsmethode aufzurufen.
Dynamischer Proxy ist in zwei Typen unterteilt: dynamischer Proxy für Schnittstellen und dynamischer Proxy für normale Klassen. Dynamischer Proxy in Java ist ein dynamischer Proxy für reale Schnittstellen. CGLIB ist ein dynamischer Proxy für normale Klassen. Das Ziel-Javaee-Abhängigkeitspaket und das Spring JAR-Paket enthält bereits CGGLIB-bezogene JAR-Pakete, sodass Sie den Proxy- oder normalen Klassen dynamisch stellten.
(1) .Javas dynamischer Proxy für Schnittstellen:
Dynamischer Proxy in Java kann nur für Schnittstellen dynamisch proxyiert werden. Daher muss das Zielobjekt Schnittstellen implementieren, und das Proxy -Objekt muss alle Schnittstellen des Zielobjekts implementieren. Der Workflow ist wie folgt:
A. Dynamisches Proxyklassenschreiben:
Hinweis: Dynamic Proxy muss die InvocationHandler -Schnittstelle implementieren und die folgenden Methoden implementieren:
Die Codekopie lautet wie folgt:
Object Invoke (ObjectM -Proxyinstanz, Methodeninstanz der Schnittstellenmethode, die auf Methode Proxy -Instanz aufgerufen wurde, Objekt [] Ein Objektarray von Parameterwerten, die in die Proxy -Instanz übergeben wurden);
Die Dokumentation zur Installation von JDK wird erläutert. Diese Methode wird verwendet, um die Proxy -Instanz zu übergeben, das Objekt java.lang.reflect.method, das die Methode aufruft, und ein Array von Objekttypen, die Parameter enthalten. Der Anrufhandler behandelt den Coded -Methode -Aufruf in entsprechender Weise und das Ergebnis, das er zurückgibt, wird als Ergebnis des Methodenaufrufs der Proxy -Instanz zurückgegeben.
B. Erstellen Sie ein Proxy -Objekt:
Proxy.NewproxyInstance (Klassenloader, Klasse <?> [] Interface Array, Callback -Proxy -Objekt (normalerweise dies))
Wenn die Zielobjektmethode aufgerufen wird, wird das Proxy -Objekt des Zielobjekts über die Methode erstellt. Das Proxy -Objekt ruft automatisch seine Invoke -Methode auf, um das Zielobjekt aufzurufen und das Anrufergebnis zurückzugeben.
(2) .Cglib ist dynamischer Proxy für gewöhnliche Java -Klassen:
Wenn CGLIB einen dynamischen Proxy erstellt, muss die Zielklasse keine Schnittstelle implementieren. Sein Workflow ist wie folgt:
A. Dynamisches Proxyklassenschreiben:
Enhancer Enhancer = neuer Enhancer (); // Setzen Sie die übergeordnete Klasse der Zielklasse in ihren eigenen Enhancer.setsuperClass (Zielklasse Object.getClass ()); // Setzen Sie das Rückrufobjekt auf das dynamische Proxy -Objekt selbst Enhancer.setCallback (this);
B. Implementieren Sie die methodInceptor -Schnittstelle:
Implementieren Sie die folgende Methode:
Object Intercept (ObjectM Proxyinstanz, Methodeinstanz der Schnittstellenmethode, die auf Methode Proxyinstanz aufgerufen wurde, Objekt [] Ein Objektarray von Parameterwerten, die an den Methodenaufruf der Proxyinstanz, MethodProxy -Methode -Proxy -Instanz, übergeben wurden);
HINWEIS: CGGLIB kann nicht nur dynamisch für Klassen, sondern auch dynamisch Proxy für Methoden proxy proxy.
3.. Grundlegende Konzepte der orientierten Programmierung (AOP):
Nehmen Sie als Beispiel eine gewöhnliche Java -Methode auf
public return tytyp Methodame (Parameterliste) {-> Surround-Benachrichtigungsmethode Vorverarbeitungscode-> Vorabmessung Try {methodspezifische Implementierung (Methode Body) ... Methode Post-Prozessing-Code-> Post-Notifikation} catch (Ausnahmetyp E) {Ausnahmehandling ...-> Ausnahmebenachrichtigung} Schließlich {letzt
A. Überschneidungsbedenken: Zum Beispiel in den oben genannten 5 Benachrichtigungsorten in Java-Objekten werden diese Objekte mit einer ähnlichen gemeinsamen Verarbeitungslogik, die der Verarbeitungslogik wie der Verifizierung von Berechtigungen, der Verarbeitung, der Protokollierung usw. hinzugefügt werden können, als Kreuzkutungsbedenken bezeichnet werden. Der Fokus der objektorientierten Programmierung (OOP) liegt in der realen Welt vertikal abstrakt in ein Programmierobjektmodell. Der Fokus der Aspekt-orientierten Programmierung (AOP) ist horizontal, was die Orte, die der Verarbeitungslogik im Programmierobjektmodell ähneln, um eine Tangente zu bilden, während die Verarbeitungslogik im Programmierobjekt horizontal Tangentenfokus ist.
B. Aspekt: Das Abtrktieren der Kreuzungsbedenken besteht darin, einen Abschnitt zu bilden, der der Klasse ähnelt. Die beiden haben unterschiedliche Bedenken. Klassen sind Abstraktionen der Merkmale von Dingen, und Abschnitte sind Abstraktionen von Übergreifungsbedenken.
C. Joinpoint: Der Punkt, auf den abgefangen wird, wird im Frühjahr genannt, da Spring nur die Methodenverbindungspunkte, dh die abgefangene Methode, unterstützt. Methode wie im obigen Beispiel gezeigt.
D. Pointcut: Bezieht sich auf die Definition des Abfangens eines Verbindungspunkts, bei dem es sich um eine Sammlung von Verbindungspunkten handelt, dh eine Sammlung einer Reihe abgefangener Methoden.
e. Ratschläge: Bezieht sich auf das, was nach dem Abfangen des Verbindungspunkts zu tun ist, dh logische Verarbeitung nach Abschluss. Die übliche Berechtigungsüberprüfung, die Verarbeitung, die Protokollierung und andere Operationen werden in Benachrichtigungen definiert und abgeschlossen.
F. Ziel: Das Zielobjekt des Proxy, dh das abgefangene Objekt. Wie im obigen Beispiel, das Objekt, in dem sich die Methode befindet.
G. Weave: Bezieht sich auf den Prozess der Anwendung eines Abschnitts auf das Zielobjekt und die Erstellung eines Proxy -Objekts.
H. Einführung: Ohne den Code zu ändern, kann die Einführung während der Laufzeit einige Methoden und Felder in die Klasse hinzufügen.
4. Spring unterstützt Abhängigkeiten, die orientierte Programmierung (AOP) unterstützen:
Die folgenden 3 Pakete im Verzeichnis nach dem Frühling sind dekomprimiert:
lib/Aspekt/Aspektjweaver.jarlib/Aspekt/Aspektjrt.jarlib/cglib/cglib-nodep-2.1-3.jar
5. Wenn Sie im Frühjahr die Aspekt-orientierte Programmierung (AOP) verwenden, müssen Sie den AOP-Namespace in der Federkonfigurationsdatei einführen, dh die folgende Konfiguration hinzufügen:
XMLNS: AOP = ”http://www.springframework.org/schema/aop” „http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd ”
Hinweis: Spring 2.5 bietet zwei AOP -Methoden, nämlich auf der XML -Konfigurationsdatei und der Java -Annotationsmethode.
Um die Annotationsmethode AOP zu verwenden, müssen Sie die folgende Objektanschlagsmethode in der Feder -Konfigurationsdatei hinzufügen:
<AOP: Aspektj-Autoproxy/>
6. JavaBean -Verpackungsklasse - Beanwrapper:
Frühling fasst das Verhalten eines Javabäers durch die Beanwrapper -Klasse zusammen und kann seine Attributwerte festlegen und erhalten, wie z. B.:
BeanWrapper Wrapper Class Object = BeanWrapperImpl (neue verpackte Klasse ()); Wrapper Class Object.SetPropertyValue ("Eigenschaftsname", "Eigenschaftswert");
Mit dieser Methode können Sie Eigenschaften auf die verpackte Klasse einstellen.
7. orientierte Entwicklung (orientierter Programmierentwicklung) basierend auf Annotation:
(1). Fügen Sie AOP -Unterstützung für Annotationsmethoden in der Feder -Konfigurationsdatei hinzu.
(2). Definieren Sie den Abschnitt:
Ähnlich wie bei der Erstellung einer normalen Klasse zeigt das Hinzufügen der Annotation "@aspect" vor der Klasse an, dass die Klasse ein Abschnitt ist.
(3). Fügen Sie Einstiegspunkte zur Schnittfläche hinzu:
Ein Punktschnittpunkt ist eine Sammlung abgefangener Objektmethoden. Normalerweise wird der Punktschnittpunkt in einer Methode zur Verarbeitung des Punktschnittpunkts im Abschnitt definiert. Verwenden Sie die Annotation "@pointcut", und die Syntax lautet wie folgt:
@Pointcut ("Execution (*com.test.service ..*.*(..)") public void AnymeThod () {// Die Methode wird als "Point-Cut" und "Point-Cut"-Verarbeitung} bezeichnet.
Detaillierte Erläuterung der Syntaxparameter:
A. Das erste "*": bedeutet, dass die abgefangene Methode ein willkürlicher Rückgabetyp ist.
B. com.test.service: Hier ist ein einfaches Beispiel, das den Namen des zu abgefangenen Pakets angibt, dh das zu abgefangene Paket.
C. Die beiden ".." nach dem abgefangenen Paketnamen: bedeutet, dass die Unterpackungen unter dem abgefangenen Paket auch rekursiv abgefangen werden, dh die abgefangene Unterpackung.
D. "*" nach "..": repräsentiert alle Klassen unterhalb des abgefangenen Pakets und dessen Unterpackung, dh der abgefangenen Klasse.
e. Das letzte "*": repräsentiert alle Methoden in der abgefangenen Klasse, dh die abgefangene Methode.
F. "(..)": bedeutet, dass die abgefangene Methode alle Parameter empfängt, dh die abgefangenen Parameter.
Hinweis: Die Syntax der Punkt-Cut-Definition kann Wildcard-Zeichen unterstützen, aber Sie müssen die Syntaxregeln strikt befolgen. wie:
@Pointcut ("Ausführung (*com.test.service ..*. Add*(..))") Dies bedeutet, Methoden abzufangen, die mit "Add" in allen Klassen unter dem Com.test.Service -Paket und seinem Unterpackung beginnen.
(4). Fügen Sie dem Abschnitt Benachrichtigungen hinzu:
Informationen zu Benachrichtigungsorten im Frühjahr finden Sie in den kleinen Beispielen in 3.
"@Before" Annotation: Deklarieren Sie eine Vorverkleidung.
"@AfterRutruning" Annotation: Nach dem NOTIFIZIERUNG ERKENNEN.
"@After" Annotation: Deklarieren Sie die endgültige Mitteilung.
"@Afterthring" Annotation: Deklary AUSSCHLIESSUNGEN -Benachrichtigung deklarieren.
"@Around" Annotation: Erklärt zu den umgebenden Benachrichtigungen.
Ein Beispiel für die Definition von Benachrichtigungen ist wie folgt:
@Before ("AnyMethod () (der in der Schlitzfläche deklarierte Einstiegspunktname") öffentliche void doaccesscheck () {...}
Hinweis: Die Surround -Benachrichtigung unterscheidet sich geringfügig von den anderen 4 Arten von Benachrichtigungen. Die Surround -Benachrichtigung ist auf besondere Weise definiert. Die Surround -Benachrichtigung funktioniert vor und nach dem gesamten Methodenaufruf, sodass das Verbindungspunktobjekt verwendet werden muss, um den Verbindungspunkt nach der Verarbeitung der Surround -Benachrichtigung fortzusetzen. Seine Definition ist wie folgt:
@Around (Suchen Sie in Punktname) öffentliches Objekt DobasicProfiling (procedingjoinpoint pJP) löst Throwable {... Return PJP.Procece (); // Dieser Satz gibt dem Verbindungspunkt an, weiterhin andere Operationen auszuführen}}} 8. Einige Tipps zur Entwicklung von Aspektorientierter Programmierung (AOP) basieren auf Annotation:
(1). Eingabeparameter abrufen:
wie:
@Before ("Anmelden Sie den Punktname && args (Eingabeparametername)") public void dosomething (String -Eingabeparametername) {...}
(2). Holen Sie sich das Rückgabeergebnis:
wie:
@AfterReturning (pointCut = ”Sign in Punktname”, return = ”return Ergebnisname”) public void dosomething (String -Ergebnisname) {…}
9. Entwicklung von Abschnittsorientierter Programmierung (AOP) basierend auf XML:
(1). Definieren Sie die Facettenklasse und fügen Sie der Facettenklasse Benachrichtigungen hinzu.
(2). Konfigurieren Sie die Facettenklasse in der Spring -Konfigurationsdatei wie die gewöhnliche Java -Klasse.
(3). Fügen Sie die AOP -Konfiguration in der Federkonfigurationsdatei wie folgt hinzu:
<AOP: config> <!-Konfigurationsabschnitt-> <AOP: Aspekt id = "Abschnitt ID" ref = "id der Abschnittsklasse in der Federkonfigurationsdatei"> <!-Konfigurationspunkt-> <AOP: pointcut id = "Abschnitt ID" Expression = "Ausführung (*com.Test.Service ..*(..). Methoden in der Abschnittsklasse "/> <AOP: After…/>… </AOP: Aspekt> </AOP: config>
10. Transaktionsverarbeitung von Spring (Deklarative Transaktionsverarbeitung von Spring):
Einfach ausgedrückt bezieht sich eine Transaktion auf einen der grundlegendsten Vorgänge in der Datenbank. Eine ausführliche Erläuterung der Transaktion wird in der Datenbankzusammenfassung ausführlich erläutert. Eine der wichtigsten Anwendungen der orientierten Programmierung von Spring (AOP) ist das Transaktionsmanagement. Das Transaktionsmanagement von Frühling 2.5 und späteren Versionen unterstützen zwei Arten von Annotationsmethoden und XML-Dateien basierte Methoden:
(1). Transaktionsmanagement basierend auf Annotationsmethode:
A. Fügen Sie den Namespace des Transaktionsmanagements in der Feder -Konfigurationsdatei wie folgt hinzu:
xmlns: ts = http: //www.springframework.org/schema/tx http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-2.5.xsd
B. Konfigurieren Sie den Transaktionsmanager in der Feder -Konfigurationsdatei wie folgt:
<bean id = ”txmanager” class = ”org.springframework.jdbc.datasource.datasourcetransactionManager”> <Eigenschaft name = “DataSource” Ref = ”ID der in Spring konfigurierten Datenquellen -Bean”/>
C. Transaktionskonfiguration Elemente hinzufügen, die Annotationsmethoden in der Federkonfigurationsdatei unterstützen, lauten wie folgt:
<tx: Annotation-driventransaction-Manager-TX: Annotation-driventransaction-Manager = ”TxManager (ID des im Frühjahr konfigurierten Transaktionsmanager-Bean)”/>
D. Verwenden Sie Annotationsbasis-Transaktionsmanagement:
Im von Spring verwalteten Javaee -Projekt muss die Geschäftslogik der Transaktion mit der Annotation "@Transactional" hinzugefügt werden.
(2). Transaktionsverwaltung basierend auf der XML -Dateimethode:
A. Konfigurieren Sie den Transaktionsmanager in der Feder -Konfigurationsdatei wie folgt:
<bean id = ”txmanager” class = ”org.springframework.jdbc.datasource.datasourcetransactionManager”> <Eigenschaft name = “DataSource” Ref = ”ID der in Spring konfigurierten Datenquellen -Bean”/>
B. Fügen Sie die folgenden Abschnitte der Ding -Verwaltung in der Feder -Konfigurationsdatei hinzu:
<AOP: config> <!-transaktionseinstiegspunkt konfigurieren-> <AOP: pointcut id = ”transactionPointCut” Expression = ”Ausführung (*com.test.service ..*.*(..))”/> <!-transaktionsmeldung-> <aoP: advisor rating-ref = ”txadvice” pointcut-ref = ”transactionPointPope:C. Fügen Sie die folgenden Funktionen für Transaktionsbenachrichtigungen in der Feder -Konfigurationsdatei hinzu:
<tx: patce id = ”txadvice” transactionManager = ”txmanager”> <tx: Attribute> <! name = ”*”/> </tx: Attribute> </tx: Ratschläge>