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).
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.
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")
}
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).
Erstellen Sie eine Klasse für Aspect und stellen Sie der Klasse @Aspect und @Component voran.
@Component
@Aspect
public class HogeAspect{
}
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.
https://docs.spring.io/spring/docs/5.0.5.RELEASE/spring-framework-reference/core.html#aop
Recommended Posts