Laienerklärung für jemanden, der neu in den Konzepten AOP ist. Dies ist nicht erschöpfend, sollte aber beim Erfassen der Konzepte helfen. Wenn Sie bereits mit der Grundsprache vertraut sind, können Sie jetzt aufhören zu lesen.
Angenommen, Sie haben einen Mitarbeiter der normalen Klasse und möchten jedes Mal etwas tun, wenn diese Methoden aufgerufen werden.
class Employee{
public String getName(int id){....}
private int getID(String name){...}
}
Diese Methoden werden als JoinPoints bezeichnet . Wir brauchen eine Möglichkeit, diese Methoden zu identifizieren, damit das Framework die Methoden unter allen geladenen Klassen finden kann. Wir werden also einen regulären Ausdruck schreiben, der der Signatur dieser Methoden entspricht. Es gibt zwar mehr, wie Sie weiter unten sehen werden, aber dieser reguläre Ausdruck definiert Pointcut . z.B
* * mypackage.Employee.get*(*)
First * steht für den Modifikator public / private / protected / default. Das zweite * steht für den Rückgabetyp der Methode.
Aber dann müssen Sie noch zwei weitere Dinge erzählen:
- Wann sollte eine Aktion ausgeführt werden - z. B. vor / nach der Methodenausführung ODER in Ausnahmefällen
- Was soll es tun, wenn es übereinstimmt (vielleicht einfach eine Nachricht drucken) ?
Die Kombination dieser beiden wird als Beratung bezeichnet .
Wie Sie sich vorstellen können, müssten Sie eine Funktion schreiben, um # 2 ausführen zu können. So könnte es also für die Grundlagen aussehen.
Hinweis: Verwenden Sie aus Gründen der Übersichtlichkeit das Wort REGEX anstelle von * * mypackage.Employee.get*(*)
. In Wirklichkeit geht der vollständige Ausdruck in die Definition ein.
@Before("execution(REGEX)")
public void doBeforeLogging() {....} <-- executed before the matching-method is called
@After("execution(REGEX)")
public void doAfterLogging() {....} <-- executed after the matching-method is called
Sobald Sie anfangen, diese häufig zu verwenden, geben Sie möglicherweise viele @ After / @ Before / @ Around-Ratschläge an. Die wiederholten regulären Ausdrücke werden letztendlich dazu führen, dass die Dinge verwirrend und schwer zu pflegen sind. Was wir also tun, wir geben dem Ausdruck einfach einen Namen und verwenden ihn überall in der Aspect-Klasse.
@Pointcut("execution(REGEX)") <-- Note the introduction of Pointcut keyword
public void allGetterLogging(){} <-- This is usually empty
@Before("allGetterLogging")
public void doBeforeLogging() {....}
@After("allGetterLogging")
public void doAfterLogging() {....}
Übrigens möchten Sie diese ganze Logik auch in eine Klasse einschließen , die Aspect heißt, und Sie würden eine Klasse schreiben:
@Aspect
public class MyAwesomeAspect{....}
Damit all diese Dinge funktionieren, müssen Sie Spring anweisen, die Klassen zu analysieren, um die @ AOP-Schlüsselwörter zu lesen, zu verstehen und Maßnahmen zu ergreifen. Eine Möglichkeit, dies zu tun, besteht darin, Folgendes in der XML-Datei der Frühlingskonfiguration anzugeben:
<aop:aspectj-autoproxy>