Bevor Sie diesen Artikel lesen, können Sie sich auf den Artikel " Einfaches Verständnis von Spring -IOC und AOP- und Code -Beispielen " beziehen, um den relevanten Inhalt von IOC und AOP kurz zu verstehen. Kommen wir zum Thema.
Dieser Artikel erstellt Schritt für Schritt die einfachste Beispiel für die Verwendung von Spring AOP -Funktionen, die als Anfänger -Demo von Frühlings -AOP angesehen werden. Als Anfänger wurde auch die Leitung einer so einfachen Demo von vielen Fallstricken getroffen.
OOP -Problem, ergänzend zu AOP
Wenn wir verstreute Objekten öffentliches Verhalten einführen müssen, scheint OOP machtlos zu sein. Das heißt, OOP ermöglicht es Ihnen, Beziehungen von oben nach unten zu definieren, ist jedoch nicht geeignet, um Beziehungen von links nach rechts zu definieren. Zum Beispiel die Protokollierungsfunktion. Der Protokollcode wird häufig horizontal über alle Objektebenen verstreut, ohne dass es sich um die Kernfunktionalität des Objekts handelt, auf das es verstreut ist. Gleiches gilt für andere Arten von Code wie Sicherheit, Ausnahmebehandlung und Transparenz. Diese Art von irrelevantem Code, der überall verstreut ist, wird als Cross-Cuting-Code bezeichnet. Im OOP -Design verursacht es eine Menge Code -Duplikation, was der Wiederverwendung jedes Moduls nicht förderlich ist.
Der sogenannte "Aspekt", einfach ausgedrückt, fasst Logik oder Verantwortlichkeiten zusammen, die nicht mit dem Unternehmen zusammenhängen, sondern vom Geschäftsmodul gemeinsam genannt werden, was die Verringerung der Vervielfältigung des Systems durch das System, die Kopplung zwischen Modulen und Förderung zukünftiger Betriebsfähigkeit und Wartbarkeit erleichtert.
Unterstützung für AOP im Frühjahr
Der AOP -Agent im Frühjahr ist für die Erzeugung und Verwaltung von IOC -Containern von Spring verantwortlich, und seine Abhängigkeiten werden auch von den IOC -Containern verwaltet. Daher kann der AOP -Proxy direkt auf andere Bean -Instanzen im Container abzielen, und diese Beziehung kann durch Abhängigkeitsinjektion des IOC -Behälters bereitgestellt werden. Spring verwendet Java Dynamic Proxy, um standardmäßig einen AOP -Proxy zu erstellen, damit er Proxy für jede Schnittstelleninstanz erstellen kann. Wenn die Klasse, die einen Proxy benötigt, keine Proxy -Schnittstelle ist, wechselt Spring automatisch in CGGLIB -Proxy und kann auch CGGLIB erzwingen.
Die Logik dieses Beispiels lautet wie folgt: Es gibt eine Autoklasse (Business Class). Vor und nach der GO -Methode in der Autoklasse wird entsprechende Protokolldatensätze ausgeführt, aber die Autoklasse selbst kennt keine Logik des Protokolls.
Erstellen Sie ein Maven -Projekt und fügen Sie Abhängigkeiten hinzu
Erstellen Sie zunächst ein neues Maven -Projekt, verwenden Sie die MavenarchetypequickStart -Vorlage, öffnen Sie dann die Datei pom.xml und fügen Sie die Abhängigkeitspakete hinzu, die für die Ausführung des Frühlings -AOP erforderlich sind.
<Depepecy> <GroupID> org.springFramework </GroupId> <artifactID> Spring-Core </artifactId> <version> 4.0.5.Release </Version> </abhängig> <abhängigkeit> <GroupId> org.springFramework </GroupId> <artifactid> Spring-Ans. <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.0.5.RELEASE</version></dependency><dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.0.5.RELEASE</version></dependency><dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.0.5.RELEASE</version></dependency><dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.1</version></dependency>
Geschäftsordnung schreiben
Fügte ein Business -Class -Auto hinzu, einschließlich einer Go () -Methode
Paket com.wowo.spring_aop_demo1; public class Car {public void go () {System.out.println ("Go Go!"); }}Facetten schreiben
Die Protokollklasse erfasst den Betrieb des Systems, aber die Protokolllogik wird nicht überall in der Business -Klasse geschrieben, sondern als Facettenklasse existiert.
Paket com.wowo.spring_aop_demo1; public class carlogger {public void beforerun () {System.out.println ("Auto wird rennen"); } public void afrun () {System.out.println ("Auto läuft"); }}Diese Aspektklasse enthält zwei Methoden, nämlich die Vorabmessung und die Nachbearbeitung.
Konfigurieren Sie Assoziationen durch Bohnen
In diesem Beispiel eine neue Konfigurationsdatei mit dem Namen Bean.xml hinzugefügt, um das Gesicht und die Benachrichtigungen in der Konfigurationsdatei zu verknüpfen
<? xmlns: p = "http://www.springframework.org/schema/p" xmlns: context = "http://www.springframework.org/schema/context" xmlns: aoP = "http://wwww.spingframewrate XSI: Schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springramework.org/schema/contex http://www.springframework.org/schema/context/spring-context-2.xsd http://www.springFramework.org/schema/aop http://www.springframe.org/sschema/aop/aop/aPring-aoP.xi- id = "car" /> <bean id = "logger" /> <AOP: config> <aoP: Aspekt ref = "logger"> <aop: pointcut expression = "Ausführung (* com.wowo.spring_aop_demo1.car.go ()") "id =" /> <aoop: vor pittel-aprf = "go" methode " /> <aoop: vor picken-ref =" go "methode" pointcut-ref = "go" method = "AfterRun"/> </aoP: Aspekt> </aop: config> </beans>
Hinweis: In dieser Konfigurationsdatei sind der Namespace von AOP und mehrere in XSI enthaltene Adressen erforderlich.
Ausführung (* com.wowo.spring_aop_demo1.car.go (..)) ist ein Aspekt-J-Punkt-Schnitt-Ausdruck. Ausführung bedeutet, während der Ausführung auszulösen. Das folgende * repräsentiert den Rückgabewert eines beliebigen Typs. com.Wowo.spring_aop_demo1.car bezieht sich auf die Klasse, in der sich die Point-Cut befindet. Go (..) ist der Methodenname und ... repräsentiert jeden Parameter.
Es gibt 5 Arten von Benachrichtigungen, die auf Federabschnitte angewendet werden können:
・Vorher-die Benachrichtigung der Benachrichtigung wird aufgerufen, bevor die Methode aufgerufen wird
・After-eine Benachrichtigung wird aufgerufen, nachdem die Methode abgeschlossen ist, unabhängig davon, ob die Methode erfolgreich ausgeführt wird.
・After-Returning-Die Benachrichtigung wird aufgerufen, nachdem die Methode erfolgreich ausgeführt wurde
・After-Throwing-Benachrichtigung nach der Methode hat eine Ausnahme ausgelöst
・Um herum-Nichtverpackungspakete die benachrichtigte Methode und führt vor und nach dem Anruf mit benachbarter Methode ein benutzerdefiniertes Verhalten aus.
Geschäftsordnung ausführen
Im Folgenden finden Sie eine Klasse, die die main () -Methode zum Ausführen der Geschäftsordnung enthält
package com.wowo.spring_aop_demo1;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class App { public static void main( String[] args ) { ApplicationContext context = new ClassPathXmlApplicationContext ("bean.xml"); CAR Car = (Car) Context.getbean ("Car"); Ladung(); }}Im obigen Code wird ein Autoobjekt durch den Frühling erstellt. Wenn Spring dieses Objekt erstellt, wird festgestellt, dass eine seiner Methoden als Pointcut konfiguriert ist. Bei der Instanziierung des Objekts wird daher ein Proxy -Objekt erstellt. Wenn die Point-Cut-Methode go () ausgeführt wird, wird sie durch das von Spring erstellte Proxy-Objekt abgefangen. Bevor die GO-Methode ausgeführt wird, wird die entsprechende Pre-Process Carloggers entsprechende Pre-Process bererun (), dann die CAR.Go () -Methode und dann die Post-Prozess der Abschnittsklassenklasse Carlogger AfterRun () aufgerufen.
HINWEIS: Die Feder muss verwendet werden, um ein Objekt zu erstellen, das Tangenten enthält. Wenn Sie es selbst erstellen, kann Spring es nicht überwachen und sein Betrieb wird durch Anwendung nicht benachrichtigt.
Das Ausgabeergebnis des Projekts ist
Das Auto wird runter gehen gehen! Das Auto läuft
Verwenden Sie Surround -Benachrichtigungen
Wenn Sie Surround -Benachrichtigungen verwenden möchten, müssen wir die Benachrichtigungsmethoden und Konfigurationsdateien in der Aspektklasse ändern. Die Business Class muss keine Änderungen vornehmen, da sie vollständig entkoppelt sind. Ändern Sie zuerst die Abschnittsklasse Carlogger
import org.aspespectj.lang.proceedingjoinpoint; public class carlogger {public void umrun (Proceedingjoinpoint Joinpoint) {System.out.println ("Auto wird laufen"); Versuchen Sie {// Die Zielmethode des Proxy -Objekts aufrufen, in diesem Beispiel auf die car.go () -Methode joinpoint.procece (); } catch (throwable e) {e.printstacktrace (); } System.out.println ("Auto läuft"); }}Die Methode, die die Benachrichtigung umgibt, muss Parameter vom Typ Proxy -Objekt aufgerufen werden, um die Zielmethode des Proxy -Objekts zu erstellen. Unter normalen Umständen muss diese Methode aufgerufen werden. Wir können auch den Lauf des Proxy -Objekts organisieren, indem wir diese Methode nicht aufrufen.
Ändern Sie als Nächst
<AOP: config> <AOP: Aspekt ref = "logger"> <aoP: pointcut expression = "execution (* com.wowo.spring_aop_demo1.car.go (..)") "id =" go "/> <AOP: ARNAHME METHODE =" umrun "pointcut-ref =" go "/> </aoP: AP:
HINWEIS: Surround -Benachrichtigungen können nicht gleichzeitig wie vorne/zurück -Benachrichtigungen vorhanden sein. Nach dem Ausführen des Codes bleibt das Ausgabeergebnis unverändert.
Zusammenfassen
Das obige Inhalt ist der Inhalt, der in diesem Artikel über die Einführung in die Frühlings -AOP -Demo geteilt wird. Ich hoffe, er wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!