1. Einführung
Während des Entwicklungsprozesses müssen wir oft viele Beispiele schreiben:
@GetMapping ("/id/get") öffentliches Ergebnis getbyId (String -ID) löst eine Ausnahme aus {log.info ("Anforderungsparameter ist:"+id); verifizieren (neuer Verifyparam ("Abteilungs -ID", ID)); Ergebnis Ergebnis = neues Ergebnis ("erfolgreich durch ID erhalten!", Service.queryById (ID)); log.info ("Rückgabenachricht ist:"+result.toString ()); Rückgabeergebnis; }Druckenanforderungen Parameter und Rückgabeparameter drucken, und diese Vorgänge gibt es in jeder Methode, wodurch unser Code redundanter wird. Aus diesem Grund können wir dynamische Proxy verwenden, um Druckparameter und Druckmeldungen als Abschnitte zu verwenden und mit Punkte-Schnittausdrücken in jede Methode zu schneiden.
2. Schritte
1. Einführung von AOP-bezogenen Abhängigkeiten:
<!-AOP-bezogene Abhängigkeiten-> <De vor Ort> <gruppe> org.springFramework.boot </gruppeId> <artifactid> Spring-Boot-Starter-AOP </artifactid> </abhängig>
Nach der Einführung von Abhängigkeiten lädt Spring-AOP die Abhängigkeiten, die es benötigt. Spring verwendet Aspektj standardmäßig, um Benachrichtigungen zu implementieren.
Unter ihnen enthält Aspektjweaver.jar Dateien, die Aspekte-Point-Cut-Ausdrücke analysieren. Diese Abhängigkeit ist auch erforderlich, wenn die Ausdrücke von Punkten zur Behandlung von Transaktionen verwendet werden.
2. Konfiguration:
1) Erstellen Sie eine Konfigurationsklasse:
/*** @Function Beschreibung: AOP -Klasse, die für Controller -Layer -Operationen verwendet wird
Die @aspect-Annotation stellt dar, dass es sich um eine Aspektverwaltungsklasse handelt, in der Point-Cut-Ausdrücke definiert werden können, und das Aspekt-J-Framework wird sie analysieren.
2) Ausdruck der Punktschneide definieren:
@Pointcut ("Ausführung (public*com.hzt.manage.Wobei @pointcut diese Methode als Punkt-Schnitt-Ausdruck darstellt. Sein Wert ist ein Point-Cut-Ausdruck, bei dem der Wert weggelassen werden kann und sein grobes Format lautet:
@Annotation (Expression Tag + Expressionsformat)
Für das Format sind die Aspekte-Point-Cut-Indikatoren, die von Frühlings-AOP unterstützt werden, wie folgt:
1. Ausführung: Der Verbindungspunkt, der zur Übereinstimmung mit der Methodenausführung verwendet wird;
2. Innerhalb: Wird verwendet, um die Ausführung von Methoden innerhalb des angegebenen Typs zu entsprechen;
3. Dies: Ausführungsmethode, mit der der aktuelle AOP -Proxy -Objekttyp übereinstimmt; Beachten Sie, dass die Typ -Anpassung des AOP -Proxy -Objekts, das die Einführung von Schnittstellen und Typ -Matching umfasst.
4. Ziel: Ausführungsmethode, die verwendet wird, um den aktuellen Zielobjekttyp zu entsprechen; Beachten Sie, dass die Typ -Übereinstimmung des Zielobjekts die Typ -Matching ist, so dass die Einführung der Schnittstelle nicht enthalten ist.
5. Args: Die Ausführungsmethode wird verwendet, um den von der aktuell ausgeführten Methode übergebenen Parametern als angegebenem Typ abzustimmen.
6. @Within: Wird verwendet, um die Methoden innerhalb des angegebenen Annotationstyps zu übereinstimmen.
7. @Target: Ausführungsmethode, mit der der aktuelle Zielobjekttyp übereinstimmt, wobei das Zielobjekt die angegebene Annotation enthält.
8. @ARGS: Wird verwendet, um die Ausführung der Parameter zu entsprechen, die in der aktuell ausgeführten Methode übergeben wurden und die angegebene Annotation enthält;
9. @Annotation: Wird verwendet, um der Methode zu entsprechen, die derzeit die Methode ausführt, die angegebene Annotation enthält.
10. Bean: Frühlings -AOP -Erweiterung hat keine Ausführungsmethode zum Anpassen von Bean -Objekten mit einem bestimmten Namen.
11. Referenzpunkte: bedeutet, sich auf andere Namenseintrittspunkte zu beziehen, nur @APectj -Stil unterstützt es, aber nicht den Schema -Stil.
Args definiert die Parameter bei der Ausführung der Punkt-Cut-Expressionsmethode:
@Pointcut (value = "Execution (public*com.hzt.manage.
Wir konzentrieren uns auf den Ausdruck des Verbindungspunkts der Ausführungsmethode, und seine grobe Struktur lautet:
Ausführung (Modifikatoren-Muster?
1. Modifikator-Matching (Modifikator-Muster?) (Kann weggelassen werden)
2. Rückgabewertabgleich (ret-Typ-Muster) kann einen beliebigen Rückgabewert für *darstellen, z.
3. Muster für Typen? Beispielsweise ist *.Manage das Paket der ersten Ebene als willkürlich und das Paket der zweiten Ebene als Name des Verwaltens. *.. verwalten repräsentiert die Unterklassenpakete unter allen Verwaltungspaketen. com .. *. Comtroller repräsentiert alle Controller -Pakete unter COM -Paketen usw. und * bedeutet, dass alle Pakete übereinstimmen. (Nicht weggelassen)
4. Methodame-Matching (Name-Pattern) kann den Methodennamen angeben oder * Repräsentiert alle, GET * Repräsentiert alle Methoden, die mit GET beginnen, oder Sie können das Präfix angeben * GET repräsentiert jede Methode mit beliebigem Suffix von GET (nicht weggelassen).
5. Parameterübereinstimmung (((Parampattern)) kann einen spezifischen Parametertyp angeben, mehrere Parameter werden durch "" getrennt ", und jeder Parameter kann auch"*"für Parameter eines beliebigen Typs wie (String) bezeichnet, was eine Methode für einen String-Parameter bedeutet. (*, String) bedeutet eine Methode, die zwei Parametern entspricht, der erste Parameter von jedem Typ und der zweite Parameter von einem String -Typ; (..) kann verwendet werden, um einen Parameter darzustellen (nicht weggelassen)
6. Ausnahmetyp Matching (Throws-Pattern?)
3. Definieren Sie die Facettenmethode
@Around ("privilege ()") öffentliches Objekt um (ProceedingJoInpoint PJD) löscht Throwable {// den Methodnamen String classname = pjd.getSignature (). GetClass (). GetName (); // Erhalten Sie den Ausführungsmethodenname String methodname = pjd.getSignature (). GetName (); / ** Initialisierungsprotokolldruck*/ logger log = loggerFactory.getLogger (className); // Definieren Sie das Rückgabeparameterobjekt Ergebnis = NULL; // Die Startzeit long start = system.currentTimemillis () aufzeichnen; // Method -Parameter -Objekt [] args = pjd.getargs () erhalten; String params = "Die Parameter für Front-End-Anforderung sind:"; // Erhalten Sie die Anforderungsparametersammlung und das Traverse und Splice für (Objektobjekt: args) {params + = Object.toString () + ","; } params = params.substring (0, params.Length () - 1); // Das Anforderungsparameter Parameter log.info (className + "class" + methodName + "" + params) drucken; // Die Zielmethode result = pjd.procece () ausführen; // Drucken Sie die Rückgabenachrichtsprotokoll.info ("Die Methode gibt die Nachricht als:" + (Ergebnisinstanz von Ergebnissen? (Ergebnis) Ergebnis: Ergebnis)); // Erhalten Sie die Ausführungszeit log.info (methodName + "Die Methodeausführungszeit lautet:" + (System.currentTimemillis () - Start)); Rückgabeergebnis; }5. @around Surround -Benachrichtigung, wie im obigen Code gezeigt, ist die Surround -Benachrichtigung, die den Parameter "ProcessJoInpoint" enthält
Wo der pjd.procece (); Die Methode repräsentiert die Ausführung der Zielmethode und das Erhalten eines Rückgabewerts des Objekttyps. Wir können den Rückgabewert wie Dekorationsverarbeitung usw. verarbeiten.
Der Wert der Rückgabe ist das Ergebnis der Methodenausführung. Erhält im obigen Code zunächst den Klassennamen, den Methodennamen, die Methodenanforderungsparameter usw., das Druckspeisen und zeichnet die Startzeit der Methodenausführung auf und druckt es auf das Protokoll.
Führen Sie dann die Methode aus, erhalten Sie das Ergebnis der Methode Rückgabe und drucken Sie das Ausführungszeit- und Ausführungsergebnis.
Schließlich wird das Ausführungsergebnis zurückgegeben. Das heißt, die AOP -Abschnittscodierung der Anforderungsnachricht und die Rückgabenachricht wird abgeschlossen.
Wo @around es als umgebende Benachrichtigungsmethode darstellt, hat es die folgenden Typen:
1. @Before Vorabmessung, wobei der Anforderungsparameter Joinpoint enthält, mit dem die Verbindungsdetails des aktuellen Verbindungspunkts verbunden sind und im Allgemeinen den Methodennamen und den Parameterwert enthalten. Die Methodenkörper wird vor der Ausführung der Methode ausgeführt und die Methodenparameter können nicht geändert werden, und die Methodenausführungsergebnisse können nicht geändert werden.
@Before (value = "privilege ()") public void vor (joinpoint joinpoint) {}2. @After Post -Benachrichtigung: Benachrichtigung, dass die Ausführung durchgeführt wird, unabhängig davon, ob eine Ausnahme nach der Ausführung der Zielmethode auftritt. In der Nachbearbeitung kann das Ausführungsergebnis der Zielmethode nicht zugegriffen werden (da eine Ausnahme auftreten kann), und das Ausführungsergebnis der Methode kann nicht geändert werden.
@Before (value = "privilege ()") public void nach (joinpoint joinpoint) {}3. @AfterReturning gibt eine Benachrichtigung zurück. Die Benachrichtigung, die nur dann ausgeführt wird, wenn die Zielmethode ausgeführt wird, entspricht der post-arrangierten Methode. Es kann auf das Ergebnis der Methodenausführung (aufgrund der normalen Ausführung) und auf die Verbindungsdetails der Methode zugreifen, das Ergebnis der Methodenausführung jedoch nicht ändern.
@AfterReturning (value = "privilege ()") public void AfterSreturning (JoinPoint Joinpoint, Objektergebnis) {}Der im Ergebnis gespeicherte Rückgabewert ist die Methode.
4. @Afterthring Exception Benachrichtigung: Code, der nur ausgeführt wird, wenn eine Ausnahme in der Zielmethode auftritt. Das Wurfattribut stellt eine Ausnahme dar, die während der Ausführung des Method -Körpers ausgelöst wird, und sein Wert muss mit dem Wert der Ausnahme in der Methode übereinstimmen.
@Afterthrowing (value = "privilege ()", throwing = "ex") public void überschreitet (JoinPoint Joinpoint, Ausnahme ex) {}3. Test
Schreiben Sie eine Controller -Methode
@RastController@requestmapPing ("/api/v1/Dept") öffentliche Klasse DeptController erweitert BaseController {/** Protokollierungsklasse*/private logger log = loggerfactory.getLogger (getClass ()); / ** mein eigener Service*/ @autowired Private Deptservice Service; /*** @Function Beschreibung: Methode zum Abfrieren von Abteilungsinhalten basierend auf ID* @return Dept*/@getmapping ("/id/get") öffentliches Ergebnis getbyId (String -ID) löst eine Ausnahme aus {verifizieren (neuer Verifyparam ("Abteilungs -ID", ID)); Neues Ergebnis zurückgeben ("erfolgreich durch ID erhalten!", Service.QueryById (ID)); }}Auf diese Weise ist die Methode in unserer Controller -Schicht sehr präzise.
Testergebnisse:
2018-04-10 22: 59: 27.468 Info 1460 --- [NIO-8088-EXEC-5] NProceedingjoInpoint $ MethodInRatureImpl: Der Parameter für Front-End-Anforderung von GETBYID ist: 22
2018-04-10 22: 59: 27.470 Info 1460 --- [NIO-8088-EXEC-5] NPROSEVERINGJOINPOPPE $ METHODIGNATIONIMPL: Die Methode gibt die Nachricht zurück als: Ergebnis [result_code = Suc, Ergebnis, Ergebnis = 22, Nennzeichen = 22. CreateTime = Thu 19. April 23:38:37 CST 2018, Edittime = NULL]]]
2018-04-10 22: 59: 27.470 Info 1460 --- [NIO-8088-EXEC-5] NProceedingjoInpoint $ methodesignatureImpl: Die Ausführungszeit der GetByID-Methode ist: 2
Auf diese Weise können Sie Anforderungsparameter drucken, Ergebnisse, Ausführungszeit usw. mit elegantem, prägnantem und prägnantem Druck zurückgeben!