AOP Ich denke, jeder ist sehr klar. Manchmal müssen wir einige Anforderungsprotokolle bearbeiten oder einige Methoden überwachen, und was sollte behandelt werden, wenn Ausnahmen vorhanden sind? Jetzt stellen wir AOP aus Spring-Boot vor.
[Entwicklungsumgebung: JDK -Versionsnummer ist 1.8, Frühling
Die Versionsnummer des Bootes lautet 1.4.1] {style = ”Hintergrundfarbe:#ff0000”}
Erstens werden wir zuerst das JAR -Paket vorstellen.
Die POM -Datei wird wie folgt hinzugefügt:
<!-zitieren aoP-> <abhängigkeit> <GroupId> org.springframework <version> 2.7 </Version> </abhängig>
Nachdem wir das JAR -Paket eingeführt haben, fügen wir zwei einfache Anforderungsverarbeitungsmethoden zum Start von Start hinzu:
@SpringbootApplication (scanBasepackages = {"com"})@rastControllerPublic -Klasse DemoApplication {public static void main (String [] args) {SpringApplication.run (DemoApplication.Class, Args); } // Testen Sie eine GET -Anforderung ohne Argumente @RequestMapping (value = "/testaspespe", method = requestMethod.get) public uservo test () {uservo uservo = new uservo (); uservo.setage ("23"); uservo.setName ("er xiaowu"); uservo.setSex ("männlich"); Return uservo; } // Testen Sie die GET -Anforderung mit Parametern und lassen Sie AOP den Parameterinhalt @RequestMapping (value = "/testaspespecargs", method = requestMethod.get) public uservo test (String -Name, String -Alter, String -Sex) {Uservo uservo = new uservo () ausdrucken; uservo.setName (name); uservo.setage (Alter); uservo.setSex (Sex); Return uservo; }Nachdem wir zwei einfache Anforderungsverarbeitungsmethoden hinzugefügt haben, fügen wir unsere AOP hinzu
/** * Project name: SpringBootDemo * Creator: He Xiaowu* Creation time: 16/12/4 7:05 pm * Class name: AspectDemo * Class description: *///Declare is a section @Aspect//Declare is a spring managed bean@Component@Order(1)public class AspectDemo { private Logger log = Logger.getLogger(getClass()); private gson gson = new gson (); // einen Punkt im Ausführungsausdruck @pointcut deklarieren ("Ausführung (public * com.example.DemoApplication. * (..)") ") private void Controlleraspect () {} // Drucken Sie den Inhalt vor, bevor Sie die Methode anfordern @before (Value =" ControlleraSpect () ") öffentliche void methodbe (joinpoint) {ServletrequestatRIBUTRUTTRIBUTSBORTEFORTE (joinpoint) {ServiceRequestatRIBUTRUTTRIBUTSWORE (joinpoint) {ServiceRequestatRIBUTRUTTRIBUTSWORE (joinpoint). (ServletRequestattributes) RequestContexTHolder.getRequestattributes (); HttpServletRequest request = RequestAttributes.getRequest (); // den Anforderungsinhalt drucken log.info("===================================================== =================================================================== =================================================================== ====================================================================== =================================================================== ====================================================================== =================================================================== ====================================================================== // Drucken Sie den Rückgabeinhalt nach der Ausführung der Methode @AfterReturning (returning = "o", pointCut = "Controlleraspect ()") public void methodAfReturning (Objekt O) { Log.info ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------—Nachdem die beiden konfiguriert wurden, fordern und anzeigen wir das Druckprotokoll an. Starten Sie zuerst unseren Container, und dann fordern wir zuerst die parametrisierte Verarbeitungsmethode an. Das Druckprotokoll lautet wie folgt:
{width = ”1232”
Höhe = ”132”}
Es kann festgestellt werden, dass die angeforderte URL, die Methode, die Argumente -Parameterwerte, -typen und der zurückgegebene Inhalt alle ausgedruckt sind, was darauf hinweist, dass dies der AOP -Abschnitt erfolgreich ist.
Als nächstes testen wir die Anforderungsverarbeitungsmethode ohne Parameter und drucken das Protokoll wie folgt:
{width = ”1100”
Höhe = ”130”}
Wir können feststellen, dass die in dieser Methode gedruckten Methodenparameter ein leeres Array sind, da die Methode kein Parameterübergang erfordert.
Das obige Springboot Referenzen AOP für die Protokollverarbeitung der Webverarbeitung. Hier sind einige Hauptanmerkungen für AOP -Abschnitte. Das Folgende sind nur Beschreibungen und Verwendung der Anmerkungen. Der Autor wird sie nicht im Detail testen. Wenn Sie interessiert sind, können Sie sie selbst testen:
Klassenannotation:
@Aspect definiert eine Klasse als Aspektklasse
@Order (i) markiert die Verarbeitungspriorität der Facettenklasse. Je kleiner der I -Wert ist, desto höher ist die Prioritätsniveau. PS: Sie können die Klasse kommentieren oder die Methode kommentieren.
Methode Annotation:
@Pointcut definiert eine Methode als Punkt, den sie als Ausdruck geschnitten haben, die folgenden Details
@Before wird die Methode vor dem Tangentenpunkt ausführen, der Inhalt ist der angegebene Tangentenpunkt
@After führt vor der Rückkehr nach dem Point Cut aus.
@AfterReturning wird nach dem Einstiegspunkt und der Rückkehr ausgeführt. Wenn Sie die Rückgabeparameter einiger Methoden verarbeiten möchten, können Sie sie hier bedienen.
@Around umgeben den Tangentialpunkt, führen Sie vor dem Eintritt in den Tangentenpunkt und nach dem Tangentenpunkt aus
@Afterthring wirft eine Ausnahme nach dem Schlitzpunkt für die Verarbeitung aus
@Order (i) markiert die Priorität des Point Cut. Je kleiner das i ist, desto höher ist die Priorität
@Pointcut Annotation Kombination:
Im obigen Code definieren wir einen Tangentenpunkt, der nur den angegebenen Pfad verarbeitet:
@Pointcut ("Ausführung (public * com.example.DemoApplication. * (..)") private void Controlleraspect () {}Jetzt definieren wir einen Punkt -Tangente, um andere Wege zu bewältigen:
@Pointcut ("Ausführung (public*com.demo.*.*(..)") private void ControllerDemo () {}Die oben genannten Tangentenpunkte werden alle getrennt verarbeitet. Wenn wir einen Tangentenpunkt brauchen, um beide zu verarbeiten, können wir ihn so konfigurieren:
@Pointcut (value = "Controlleraspect () || ControllerDemo ()") private void All () {} In der @PointCut -Annotation beziehen Sie sich direkt auf andere von @pointCut kommentierte Methodamen, damit der Punktschnitt die Methoden unter zwei Pfaden verarbeiten kann
@Pointcut Annotation Ausführungsausdruck: public*com.demo.*.*(..)
Der erste öffentliche Modifikator, der die Methode darstellt
com.demo.* Paketpfad ,.* repräsentiert das dritte Paket im Pfad.* Repräsentiert die Methoden aller Klassen unter allen Paketen unter dem Pfad.
(..) bedeutet unbegrenzte Methodenparameter
Einige Notizen über @Order (i) Annotation:
Die Annotationsklasse, je kleiner der Wert, desto höher die Priorität, die Annotationsmethode, die beiden Annotationen werden kommentiert: Je kleiner der I -Wert ist, desto höher ist die Priorität, je höher die Priorität, desto höher ist die Priorität.
Um die beiden zusammenzufassen, ist es:
In der Operation vor dem Einstiegspunkt wird der Betrieb nach dem Einstiegspunkt durch den Bestellwert von klein bis groß und der Betrieb nach dem Einstiegspunkt durch den Bestellwert von groß zu klein durchgeführt
verlängern:
Einige Leser fragen sich möglicherweise, ob ich die für die Anfrage erforderliche Zeit für die Anforderung von eingehenden und enden drucken möchte, eine Mitgliedsvariable, um die Zeit zu zählen, und @Before und @AfterReturning Access zu geben, kann es zu Synchronisationsproblemen kommen. Wir verweisen also auf ein ThreadLocal -Objekt, das den generischen Typ angibt. Der Zeitpunkt der Aufzeichnung der Anfrage in @before und Abzweigung des Datensatzes in @AfterReturning ist die Zeitverbrauch. Der Code ist wie folgt:
/** * Project name: SpringBootDemo * Creator: He Xiaowu* Creation time: 16/12/4 7:05 pm * Class name: AspectDemo * Class description: *///Declaration is a section @Aspect//Declaration is a spring managed bean@Component@Order(1)public class AspectDemo { private Logger log = Logger.getLogger(getClass()); private gson gson = new gson (); ThreadLocal <Long> startTime = new ThreadLocal <Long> (); // einen Punkt in den Ausführungsausdruck @pointcut deklarieren ("Ausführung (public * com.example.DemoApplication. * (..)") ") private void ControlleraSpe () {} // Drucken Sie den Inhalt vor, bevor Sie die Methode @Before (value =" ControlleraSpe () ") öffentlich void methode voranfordern (joinpoint) {startTime.set (system.set). ServletRequestAttributes RequestAttributes = (ServletRequestattributes) RequestContexTHolder.getRequestAttributes (); HttpServletRequest request = RequestAttributes.getRequest (); // den Anforderungsinhalt drucken log.info("=========================================================================================================== ================================================================================ =======================================================ieben ================================================================================ =======================================================ieben =======================================================ieben =======================================================ieben Arrays.toString (joinpoint.getargs ())); log.info("========================================================================================================== Arrays.toString (joinpoint.getargs ())); log.info ("Antwortinhalt:" + gson.tojson (o)); log.info("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Die oben genannten sind alle Ergebnisse, die durch meinen Test erzielt wurden. Es kann Unterschiede oder Fehler geben. Bitte korrigieren Sie mich.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.