Ich brauche einen Punktschnitt für Methoden in Klassen, die mit @X kommentiert sind oder Methoden, die mit @X kommentiert sind.
Ich brauche auch das Annotationsobjekt . Wenn sowohl die Klasse als auch die Methode mit Anmerkungen versehen sind, bevorzuge ich es, die Annotation der Methode als Argument zu erhalten.Ich habe Folgendes versucht, was eine Warnung "inkonsistente Bindung" erzeugt. (Warum nicht einfach null setzen?)
%Vor%Im Folgenden wird eine "mehrdeutige Bindung von Parametern x über '||' in pointcut "Warnung. (Was meiner Meinung nach nicht unbedingt Sinn macht: Warum binden Sie nicht die erste Kurzbewertung?)
%Vor%Wenn Sie den vorherigen Versuch in zwei Teile aufteilen, führt dies natürlich zu zwei Methodenaufrufen, wenn Klassen- und Methodenanmerkungen vorhanden sind.
Ich weiß, dass ich die Methode und Klasse mit Reflektion und meine gewünschte Annotation mit einem Punktschnitt wie folgt erhalten könnte:
%Vor%Aber ich möchte lieber nicht.
Gibt es ein "One Pointcut, eine Methode, ein Annotationsargument", eine Lösung für meine Anforderung, die keine Reflektion erfordert?
Nicht ganz, aber fast. Sie benötigen zwei Pointcuts, zwei Ratschläge, aber Sie können die Arbeit an eine einzige Methode delegieren. So würde es aussehen:
%Vor% Beachten Sie, dass ich neben dem Aufteilen der Punktcodes @annotation()
und @within()
den resultierenden Punktzügen Einschränkungen hinzugefügt habe, damit sie nicht zu breit sind. Ich nehme an, dass Sie Methodenausführung Join-Punkte wollen, also fügte ich die benötigten Pointcut-Ausdrücke hinzu, die diese auf die Methodenausführung beschränken würden. Sie stimmen überein
@X
mit einem beliebigen Rückgabetyp in einer beliebigen Klasse in einem Paket versehen ist für den ersten Hinweis @X
für den zweiten Kommentar versehen ist. Die weitere Einschränkung von @within(X)
und @annotation(X)
ist praktisch, weil @within(X)
für sich selbst
jeder Join-Punkt, an dem der zugehörige Code in einem Typ mit definiert ist eine Anmerkung vom Typ
X
was method-execution , Methodenaufruf , Konstruktorausführung , Konstruktoraufruf einschließt, Vorinitialisierung , statische Initialisierung , Initialisierung , Feldsatz , Feld get , Ausnahmehandler , Sperre geben Join-Punkte ein (nicht alle Join-Punkte sind jedoch für um Ratschläge gültig). In ähnlicher Weise würde @annotation(X)
für sich selbst
Jeder Join-Punkt, an dem der Betreff eine Anmerkung vom Typ
hatX
, was abhängig vom Zieltyp Ihrer Anmerkung auch die meisten der zuvor erwähnten Join-Punkte bedeuten könnte.
Tags und Links java spring aop spring-aop