[JAVA] Spring AOP zum ersten Mal

Dieses Mal möchte ich über Spring AOP schreiben. Wenn Sie die detaillierten Spezifikationen erfahren möchten, lesen Sie bitte Offizielle Referenz. Die Version ist Spring Boot 2.0.1.RELEASE (Spring 5.0.5.RELEASE).

Was ist AOP?

AOP steht für ** Aspect Oriented Programming ** und heißt "Aspect Oriented Programming". Schreiben Sie in AOP Code, um die klassenübergreifende Verarbeitung (Ausnahmeverarbeitung, Protokollierung, Transaktionsverarbeitung usw.) von der Geschäftslogik zu trennen. Dies ermöglicht es, einfach mehrere Prozesse zu schreiben und zu verhindern, dass Code, der denselben Prozess ausführt, an verschiedenen Stellen geschrieben wird.

Begriffe, die häufig im Frühjahr AOP verwendet werden

Aspect Aspekt ist ein Modul, das das Querschneiden definiert und wo es zu tun ist. Wenn Sie im Frühjahr einer Klasse @Aspect hinzufügen, wird diese Klasse als Aspekt erkannt. Sie müssen Aspect als Bean definieren. Vergessen Sie also nicht, es mit @Component als Bean zu deklarieren. (@Service und @Repository, bei denen @Component intern deklariert ist, sind ebenfalls in Ordnung.)

@Component
@Aspect
public class HogeAspect{

}

JoinPoint JoinPoint bezieht sich auf die Stelle (Methode), an der der Querschnittprozess eingefügt wird. PointCut PointCut ist eine Darstellung einer Sammlung von JoinPoints. Drücken Sie PointCut als Parameter der (später beschriebenen) Hinweisanmerkung aus, wie im folgenden Codebeispiel gezeigt. Im folgenden Beispiel wird JoinPoint durch execute () angegeben.

@After(value = "execution(* com.example.fuga..Fuga.*(..))")
public void Hoge(/* .. */){
  /* .. */
}
/*Wenn im Frühjahr keine anderen Parameter vorhanden sind, wird der Parameter value "value" verwendet.=Kann also weggelassen werden
@After("execution(* com.example.fuga..Fuga.*(..))")Sie können auch schreiben.*/

In execute () wird JoinPoint durch die folgende Syntax ausgedrückt.

execution(Rückgabewert Paketname.Name der Klasse.Methodenname(Argumenttyp))
/*
「*」 ->Stellt eine beliebige Zeichenfolge dar. Wenn es jedoch als Paketname verwendet wird, repräsentiert es "ein Paket mit einem beliebigen Namen", und wenn es als Argument verwendet wird, repräsentiert es "einen beliebigen Typ".
「..」 ->Wenn es als Paketname verwendet wird, repräsentiert es "ein Paket von 0 oder mehr", und wenn es als Argument verwendet wird, repräsentiert es "jeden Typ von 0 oder mehr".
*/ 

Im ersten Beispiel wird ausgedrückt, dass @After auf alle Methoden der Klasse "Fuga" unter dem Paket "com.example.fuga" (einschließlich Unterpaketen) mit einem beliebigen Rückgabewert angewendet wird. tun.

Neben Ausführung () gibt es verschiedene Dinge wie innerhalb () und this (), aber Ausführung () wird häufig verwendet. Referenz

Advice Die Beratung repräsentiert den von JoinPoint selbst durchgeführten Querschnittsprozess. Durch Annotieren einer Methode einer Klasse mit @Aspect kann diese Methode als Hinweis ausgeführt werden. Es gibt fünf Arten von Anmerkungen, die Ratschläge darstellen: @Before Hinweis, der vor der Verarbeitung der Zielmethode ausgeführt wird.

@Before("execution(* *..*(..))")
public void beforeHandler(){
/* .. */
}

@After Hinweis, der unabhängig vom Verarbeitungsergebnis der Zielmethode immer ausgeführt wird.

@After("execution(* *..*(..))")
public void afterHandler(){
/* .. */
}

@AfterReturning Hinweis, der nur ausgeführt wird, wenn die Verarbeitung der Zielmethode erfolgreich abgeschlossen wurde. Wenn Sie im Rückgabeparameter eine Zeichenfolge angeben, wird der Rückgabewert der von JoinPoint ausgeführten Verarbeitung in der Variablen dieser Zeichenfolge gespeichert. Dadurch kann der Rückgabewert in Advice verwendet werden.

@AfterReturning(value = "execution(* *..*(..))", returning = "r")
public void afterReturning(Object r){
  System.out.println(r);
}

@AfterThrowing Hinweis, der nur ausgeführt wird, wenn während der Verarbeitung der Zielmethode eine Ausnahme auftritt. Wenn Sie im Parameter throw eine Zeichenfolge angeben, speichert die Variable in dieser Zeichenfolge die Ausnahme, die bei dem von JoinPoint ausgeführten Prozess aufgetreten ist. Dadurch können Ausnahmen in der Beratung verwendet werden.

@AfterThrowing(value = "execution(* *..*(..))", throwing = "e")
public void afterThrowing(Throwable e){
  System.out.println(e.getMessage());
}

@Arround Hinweise, die jederzeit vor oder nach der Verarbeitung der Zielmethode ausgeführt werden können. Wie im folgenden Beispiel gezeigt, können Vor- und Nachbearbeitung frei eingestellt werden.

@Arround("execution(* *..*(..))")
public void arround(ProceedingJoinPoint pjp) throws Throwable {
  System.out.println("Vorverarbeitung")

  //Methodenausführung
  Object result = pjp.proceed();

  System.out.println("Nachbearbeitung")
}

Wie benutzt man

Fügen Sie der pom.xml eine Bibliothek hinzu

Wenn Sie Spring Boot verwenden, fügen Sie "Spring-Boot-Starter-Aop" zu den Abhängigkeiten in pom.xml hinzu. Wenn "Spring-Boot-Starter-Parent" als Parent angegeben ist, muss die Version von Spring-Boot-Starter-AOP nicht angegeben werden, da die Versionsinformationen bereits definiert wurden.

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
</dependencies>

Wenn Sie Spring Boot nicht verwenden, können Sie es verwenden, indem Sie "spring-aop" und "aspectjweaver" zu pom.xml hinzufügen und @EnableAspectJAutoProxy zu JavaConfig hinzufügen (Vorgang nicht bestätigt).

Aspekt erstellen

Erstellen Sie eine Klasse für Aspect und stellen Sie der Klasse @Aspect und @Component voran.

@Component
@Aspect
public class HogeAspect{

}

Erstellen Sie Ratschläge und schreiben Sie PointCut

Erstellen Sie eine Methode in der als Aspekt definierten Klasse. Kommentieren Sie den oben beschriebenen Hinweis entsprechend dem Zeitpunkt der Ausführung des Hinweises. Verwenden Sie außerdem execute (), um zu beschreiben, in welcher Klasse oder Methode der erstellte Hinweis in der Hinweisanmerkung angewendet wird.

@Component
@Aspect
public class HogeAspect{
  
  @AfterThrowing(value = "execution(* *..*(..))", throwing = "ex")
  public void handler(Throwable ex){
    /* .. */
  }
}

Im obigen Beispiel ist die Ausnahmebehandlung für Ausnahmen definiert, die in allen Methoden auftreten.

Referenz

https://docs.spring.io/spring/docs/5.0.5.RELEASE/spring-framework-reference/core.html#aop

Recommended Posts

Spring AOP zum ersten Mal
Spring Boot zum ersten Mal
Einführung in Java zum ersten Mal # 2
Wände von der ersten Rspec getroffen
Ich habe zum ersten Mal versucht, Docker zu berühren
Zum ersten Mal lernen Java # 3 Ausdrücke und Operatoren
Versuchen Sie vorerst, Spring Cloud Config auszuführen
Lernnotiz beim ersten Lernen von Java (persönliches Lernnotiz)
Wie man Kotlin zum ersten Mal studiert ~ Teil 2 ~
Wie man Kotlin zum ersten Mal studiert ~ Teil 1 ~
[Rails] Ich habe zum ersten Mal versucht, die button_to-Methode zu verwenden
Memo nach dem ersten Frühjahrsprojekt-MVC-
Memo nach dem ersten Frühjahrsprojekt-Datenbank-
Erstmaliges Modellieren von Digimon mit DDD Teil 1
Denken Sie daran, wenn Rails (Turbolinks) die Seite nicht zum ersten Mal lädt
Memo nach dem ersten Frühlingsprojekt-Was ist Frühling-
Zum ersten Mal Kotlin berühren - Enum Classes
Verwenden Sie die Methode l für die Zeitnotation
Über Spring AOP
[Erstes Java] Machen Sie etwas, das vorerst mit Intellij funktioniert
Die Geschichte der ersten Veröffentlichung der Android-App im Play Store.
Über den Frühling AOP
[Socket-Kommunikation (Java)] Eindrücke von der erstmaligen Implementierung der Socket-Kommunikation in der Praxis
Erstellen einer App und erstmaliges Bereitstellen mit heroku
Erste Programmierung in meinem Leben Java 1st Hello World
Stimmt die Anmerkungen auf der Schnittstelle mit Spring AOP überein
Installieren Sie vorerst Amazon Corretto (Vorschau)
Verwenden Sie vorerst eine externe Java-Bibliothek
Führen Sie jetzt Dataflow, Java, Streaming aus
Die Geschichte, absichtlich zum ersten Mal in meinem Leben Try Catch zu verwenden
Eindrücke und Zweifel an der erstmaligen Verwendung von Java in Android Studio
Eine Geschichte über einen Super-Anfänger, der zum ersten Mal am AtCoder-Wettbewerb teilnimmt (AtCoder-Anfängerwettbewerb 140)
[Für Anfänger] DI ~ Die Grundlagen von DI und DI im Frühjahr ~
Erster Frühlingsstiefel (DI)
Über Spring AOP Pointcut
[Vollständige Programmierung] §1 Erste Programmierung
[Erster Beitrag] Geben Sie das Wort Ausverkauft für verkaufte Produkte aus
[Android Studio / Java] Was Sie nicht verstehen, wenn Sie es zum ersten Mal berühren
Befehl, um Docker vorerst zu verwenden
Übersicht über Spring AOP
Ändern Sie das Injektionsziel für jede Umgebung mit Spring Boot 2
Hallo Welt mit Ruby-Erweiterungsbibliothek vorerst
Die erste WEB-Anwendung mit Spring Boot-Making a Pomodoro Timer-
Anfängerfreundliches Veröffentlichungsverfahren für Android-Apps, das um die erste Version kämpft⁈
Mit der Software, die ich schon lange mache ...
[DL4J] Erstes Java Deep Learning (Handschriftliche Zeichenerkennung über ein vollständig verbundenes neuronales Netzwerk)
[Java] Spring AOP-Ausführungsreihenfolge
Build Spring für Android 2.0.0
Wofür ist der Konstruktor?
Probieren Sie das Spring WebFlux-Tutorial aus
Spring Boot zum Lernen von Anmerkungen
Java14 kam heraus, also habe ich vorerst versucht aufzunehmen
Was ein unerfahrener Mensch jetzt nach einem Monat Selbststudium in der Programmierung zum ersten Mal denkt.
Lassen Sie uns den Berechtigungscode-Grant-Flow mit Spring Security OAuth-Teil 2: Erstellen einer App vorerst erleben
[Ruby on Rails] Beim ersten Anmelden ・ So teilen Sie den Bildschirm mit jQuery in zwei Hälften