Erfahren Sie mehr über AOP nach dem vorherigen DI. Bitte beachten Sie, dass der Inhalt sehr einführend ist.
AOP(Aspect-Oriented Programming)
Aspektorientierte Programmierung ist eines der Konzepte von Entwicklungsmethoden wie objektorientiert. Beim Schreiben einer Methode wird die Verarbeitung gemischt, die nicht in direktem Zusammenhang mit den gewünschten Aktionen steht, z. B. die Protokollierungsverarbeitung und die Authentifizierungsverarbeitung. Dies ist eine Entwicklungsmethode, die versucht, eine solche Hilfsverarbeitung zu trennen und zu beschreiben (Bedenken). Angenommen, Sie haben die folgende Methode "drinkAlcohol ()".
➀ Start Log: Ich werde trinken!
↓
➁ Trinken
↓
➂ End Log: Ich habe mich betrunken!
In diesem Fall sind (1) und (3) Prozesse, die nicht direkt mit dem "Trinken" zusammenhängen, daher werden sie an verschiedenen Stellen separat beschrieben. Setzen Sie dann ① vor der Ausführung der Methode und ③ nach der Ausführung. Jetzt kümmert sich die Methode "drinkAlcohol ()" nicht mehr um den Protokollierungsprozess, sondern nur um den "Trink" -Prozess.
Die Idee, die Hilfsverarbeitung (Bedenken) auf diese Weise zu trennen und zu modularisieren, wird als AOP bezeichnet. Es ist alt, aber [hier](http://netail.net/aosdwiki/index.php?%A5%A2%A5%B9%A5%DA%A5%AF%A5%C8%BB%D8%B8%FE Die Erklärung von% A5% D7% A5% ED% A5% B0% A5% E9% A5% DF% A5% F3% A5% B0) war leicht zu verstehen.
der Begriff | Bedeutung |
---|---|
Aspect | Eine Zusammenfassung des allgemeinen Verarbeitungsverhaltens (Bedenken) und der anzuwendenden Punkte =Eine Zusammenfassung von Ratschlägen und Pointcut |
Advice | Separates allgemeines Verarbeitungsverhalten Der Prozess selbst, der tatsächlich ausgeführt wird |
JoinPoint | Zeitpunkt, um Ratschläge zu geben Vor oder nach dem Ausführen einer Methode usw. |
PointCut | Bedingungen für die Anwendung Beratung Bedingter Ausdruck, um zu bestimmen, ob Advice ausgeführt werden soll, wenn JoinPoint erreicht ist |
Eine Anmerkung wird bereitgestellt, um den Zeitpunkt der Ausführung der Beratung festzulegen.
Anmerkung | zeitliche Koordinierung |
---|---|
@Before | Wird vor dem Ausführen der Methode ausgeführt |
@After | Wird nach dem Ausführen der Methode ausgeführt Das Ausführungsergebnis spielt keine Rolle |
@Around | Wird anstelle der Methode ausgeführt. Verarbeitung vor und nach der Methode |
@AfterReturning | Wird ausgeführt, wenn die Methode normal endet |
@AfterThrowing | Wird ausgeführt, wenn in der Methode eine Ausnahme auftritt |
Beschreibt den bedingten Ausdruck, der den Rat ausführt. Werfen wir einen Blick auf das häufig verwendete Ausführungsformat.
Ausführung (Methodenmodifikator Rückgabewert Paketname.Klassenname.methodenname (Argumenttyp) löst Ausnahme aus)
Methodenmodifikatoren und Auslöseausnahmen sind optional.
@Before("execution(* com.sample..*(..))")
Im obigen Beispiel wird es ausgeführt, bevor die Methode unter dem Paket "com.sample" ausgeführt wird. Platzhalter können in bedingten Ausdrücken verwendet werden.
Platzhalter | Bedeutung |
---|---|
* | Anstelle eines beliebigen Typs oder Teils eines Klassen- oder Paketnamens |
.. | Anstelle eines Arguments oder eines Teils des Klassen- oder Paketnamens |
+ | Geben Sie alle Unterklassen- und Schnittstellenimplementierungen an, indem Sie rechts neben den Klassennamen und den Schnittstellennamen schreiben |
Zusätzlich zu "Ausführung" stehen die folgenden Anweisungen zur Verfügung.
PointCut-Direktive | Ausführungsbedingung |
---|---|
within(Name der Klasse) | Gilt für Methoden der angegebenen Klasse |
target(Name der Klasse) | Gilt für Methoden von Klassen, die die angegebene Klasse erben (gilt sowohl für übergeordnete als auch für untergeordnete Klassen) |
args(Argumenttyp) | Gilt für Methoden mit Argumenten, die dem angegebenen Argument entsprechen |
@annotation(Anmerkung) | 指定したAnmerkungが付いているメソッドに適用 |
Ich habe versucht, die obige Methode "drinkAlcohol ()" mit AOP zu realisieren.
Drink.java
public class Drink {
public void drinkAlcohol() {
System.out.println("drinking...");
}
}
Schreiben Sie nicht den Protokollierungsprozess, sondern beschreiben Sie nur (2) den Prozess des Alkoholkonsums.
SampleAspect.java
@Aspect
@Component
public class SampleAspect {
@Before("execution(* com.sample..*(..))")
public void beforeDrinking() {
System.out.println("[@Before]start drinking alcohol!");
}
@After("execution(* com.sample..*(..))")
public void afterDrinking() {
System.out.println("[@After]I got drunk...zzZ");
}
}
Fügen Sie der Klasse Anmerkungen zu @Aspect und @Component hinzu. @Vorher ist (1) Startprotokoll und @Nach ist (3) Endprotokoll.
Das Ausführungsergebnis ist wie folgt.
[@Before]start drinking alcohol!
drinking...
[@After]I got drunk...zzZ
Protokolle werden vor und nach der Methode ordnungsgemäß ausgegeben.
@Around
Lassen Sie uns nun den gleichen Prozess mit @Around realisieren.
SampleAspect.java
@Aspect
@Component
public class SampleAspect {
@Around("execution(* com.sample..*(..))")
public void aroundDrinking(ProceedingJoinPoint pjp) {
System.out.println("[@Around]start drinking alcohol!"); //Alle Verarbeitung (➀ Startprotokoll)
try {
pjp.proceed(); //Rufen Sie die Methode auf (➁ drinkAlcohol)())
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("[@Around]I got drunk...zzZ"); //Nachbearbeitung (➂ Endprotokoll)
}
}
@Around führt Around-Ratschläge anstelle der Zielmethode aus. Sie können die Methode mit "ProceedingJoinPoint.proceed ()" aufrufen, sodass Sie die Protokollierungsverarbeitung vorher und nachher ausführen möchten.
AOP im Frühjahr Interpretieren Sie den im Frühjahr verwendeten AOP grob Spring Aspect Oriented Programming Spring AOP --Pape SE Blog
Recommended Posts