Vorwort
AOP ist die Abkürzung für eine Aspekt -orientierte Programmierung. Es ist ein Konzept, das der objektorientierten Programmierung entgegengesetzt ist. In der objektorientierten Programmierung neigen wir dazu, Konzepte wie Kapselung, Vererbung und Polymorphismus zu übernehmen, um jede Funktion im Objekt zu implementieren. In tatsächlichen Situationen stellten wir jedoch auch fest, dass es eine weitere Anforderung gibt, dass in vielen Methoden vieler Objekte eine Art von Funktion benötigt wird. Beispielsweise haben einige Methoden für den Datenbankzugriff Transaktionsverwaltungsanforderungen, und für viele Methoden erfordern Druckprotokolle. Auf objektorientierte Weise müssen dieselben Funktionen an vielen Stellen implementiert oder an vielen Orten aufgerufen werden. Dies ist sehr umständlich und ist zu eng mit diesen geschäftsunabhängigen Anforderungen verbunden. Später schien die Aspekt-orientierte Programmierung diese Art von Problem zu lösen und machte eine gute Ergänzung für objektorientierte Programmierung gut
Konzept
Um die tangentorientierte Programmierung gut zu verstehen, müssen Sie zunächst einige Konzepte von AOP verstehen. In Java implementiert Aspektj die Funktionen von AOP relativ vollständig, aber es ist auch komplexer zu bedienen. Hier geht es hauptsächlich um die AOP von Spring zu diskutieren. Frühlings -AOP nimmt das Prinzip der Einfachheit und Angemessenheit an, um die Kernfunktionen von AOP zu verwirklichen. Lassen Sie uns zuerst über die spezifischen Konzepte in AOP sprechen
Sprinboot AOP -Implementierung
Wir haben mehrere Kapitel verwendet, um die grundlegende Verwendung von Springboot zu beschreiben. Hier verwenden wir Springboot und AOP, um eine Funktion zu implementieren, um alle REST -Schnittstellen -Eingangsparameter und Rückgabeparameter auszugeben.
Implementieren Sie die REST -Dienstfunktion.
Nach dem vorherigen Artikel werden wir zunächst ein Springboot -Projekt erstellen, wie in der folgenden Abbildung gezeigt
Demo -Projekt
Springboot -Projektkonfiguration
Wir konfigurieren Springboot -Projekte wie folgt
Server: Port: 3030 Servlet: Kontext-Path: /AOP-Demospring: Jackson: Date-Format: yjyy-mm-dd HH: MM: SS-Serialisierung: Eingeschwindigkeitsausgang: Truelogging: Level: com.yanggch: Debugg
Die Jackson-bezogene Konfiguration besteht darin, Objekte in JSON-Zeichenfolgen auszugeben und die Ausgabe zu formatieren.
Controller -Klasse, die eine REST -Schnittstelle implementiert
Hier implementieren wir zwei REST -Schnittstellen. Eine ist, Halloinformationen zurückzugeben. Eine davon ist, die Anmeldeinformationen basierend auf der Eingabe zurückzugeben.
Paket com.yanggch.demo.aop.web; import com.yanggch.demo.aop.domain.Loginentität; import com.yanggch.demo.aop.domain.securityentity; import org.springframework.web.bind.annotation.pathvarable; org.springframework.web.bind.annotation.Requestbody; import org.springframework.web.bind.annotation.requestmapping; java.util.Date;/** * Security-related rest service* * @author : Yang Gaochao* @since : 2018-05-27 */@RestController@RequestMapping("/api/v1/security")public class SecurityApi { @RequestMapping(value = "/login/{shopId}", method = RequestMethod.POST) public SecurityEntity Login (@RequestBody Loginentity Loginentity, @PathVariable Long ShopID) {SecurityEntity SecurityEntity = new SecurityEntity (); SecurityEntity.SetShopid (ShopID); SecurityEntity.SetAccount (LoginEntity.getAccount ()); SecurityEntity.setPWD (LoginEntity.getPWD ()); SecurityEntity.SetLogintime (neues Datum ()); Sicherheitsentwicklung zurückgeben; } @RequestMapping (value = "/echo/{name}", method = requestMethod.get) public String login (@PathVariable String name) {return "hello," + name; }}Zunächst möchten wir die Eingabeparameter ausgeben und die Ergebnisse aller REST -Schnittstellen über die AOP -Funktion zum Protokoll zurückgeben.
Implementieren Sie Web -AOP -Funktionen.
Paket com.yanggch.demo.aop.comment; import com.fasterxml.jackson.databind.objectMapper; org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.bean.factory.Annotation.autowired; javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * web interface log* * @author: Yang Gaochao* @since: 2018-05-27 */@Aspect@Componentpublic class WebLogAspect { private static Logger log = LoggerFactory.getLogger (WebLogaspect.class); private endgültige ObjectMapper Mapper; @Autowired public WebLogaspect (ObjectMapper Mapper) {this.mapper = mapPer; } @Pointcut (" @Annotation (org.springFramework.web.bind.annotation.RequestMapping)") public void weblog () {} @before ("weblog ()") public void void dobevor (joinpoint joinpoint) {für Objekte Objekt: joinpoint.getargs () {ifPoint (Objekt. HttpServletRequest ||. } try {if (log.isdebugenabled ()) {log.debug (joinpoint.gettarget (). getClass (). getName () + ". }} catch (Ausnahme e) {e.printstacktrace (); }}} @AfterReturning (returning = "response", pointCut = "weblog ()") public void doafterReturning (Objektantwort) löscht Throwable {if (response! }}}Hier sind ein paar Dinge, auf die Sie achten sollten.
prüfen
Im Vordergrund wird die Anfrage über Postmanien initiiert, und das Ergebnis der Hintergrundprotokolleingabe ist wie folgt
2018-05-27 19: 58: 42.941 Debug 86072 --- [NIO-3030-EXEC-4] C.YANGGCH.DEMO.AOP.COMMENT.Weblogaspect: Com.yanggch.demo.aop.Web.Securityapi.login anfordern Parameter: {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
"Konto": "Yanggch",
"PWD": "123456"
}
2018-05-27 19: 58: 42.941 Debug 86072 --- [NIO-3030-EXEC-4] C.YANGGCH.DEMO.AOP.COMMENT.Weblogaspect: Com.yanggch.demo.aop.Web.Securityapi.login: Anfrage Parameter: 2001 anfordern: 2001 anfordern: 2001 anfordern: 2001 anfordern: 2001 anfordern: 2001 anfordern: 2001 anfordern: 2001
2018-05-27 19: 58: 42.942 Debug 86072 --- [NIO-3030-EXEC-4] C.YANGGCH.DEMO.AOP.COMMENT.Weblogaspect: Antwortparameter: {{
"ShopID": 2001,
"Konto": "Yanggch",
"PWD": "123456",
"Logintime": "2018-05-27 11:58:42"
}
2018-05-27 19: 58: 45.796 Debug 86072 --- [NIO-3030-EXEC-5] C.YANGGCH.DEMO.AOP.COMMENT.Weblogaspect: Com.yanggch.demo.aop.Web.Securityapi.Echo: Anfrage Parameter: "yanggch" yanggch "yanggch" yanggch "yanggch" yanggch "yanggch"
2018-05-27 19: 58: 45.796 Debug 86072 --- [NIO-3030-EXEC-5] C.YANGGCH.DEMO.AOP.COMMENT.Weblogaspect: Antwortparameter: "Hallo, Yanggch"
Daraus können wir sehen, dass wir den Code zwar nicht für die Ausgabe des Protokolls in der REST -Schnittstellenmethode schreiben, den Code automatisch für die Ausgabe der Eintragsparameter und die Rückgabeparameter zu jeder REST -Eintragsmethode über AOP hinzufügen und korrekt ausführen können.
Andere Anweisungen
Die Arten von Ratschlägen und die AOP -Ausdruckssprache für Pointcut werden früher erwähnt. Für bestimmte Referenzen finden Sie diese wie folgt.
Beratungstyp
AOP -Ausdruckssprache
1. Methodenparameteranpassung
@Args ()
2. Methodenbeschreibung Übereinstimmung
Ausführung (Modifikatoren-Muster?
Wenn ein Rückgabetypmuster, das Namensmuster und das Parametermuster erforderlich sind.
. Ret-Typ-Muster: Kann ein Klassenname sein, der jeden Rückgabewert, einen vollständigen Pfad usw. darstellt.
*. Namensmuster: Geben Sie den Methodennamen an, * repräsentiert alle
.Set repräsentiert alle Methoden, die mit dem SET beginnen.
. Parameter Muster: Methodenparameter angeben (deklarierter Typ), (..) repräsentiert alle Parameter, und () repräsentiert einen Parameter
. (, String) bedeutet, dass der erste Parameter ein beliebiger Wert und der zweite vom Typ String ist.
3. aktueller AOP -Proxy -Objekttyp Matching
4. Zielklassenübereinstimmung
@Ziel()
@innerhalb()
5. Matching -Methoden, die mit dieser Annotation gekennzeichnet sind
@Anmerkung()
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.