Ich möchte alle öffentlichen Methoden aller Klassen mit der angegebenen Annotation (z. B. @Monitor) überwachen (Hinweis: Annotation ist auf Klassenebene). Was könnte ein möglicher Punkt dafür sein? Hinweis: Ich verwende Spring AOP im @AspectJ-Stil.
java
aop
aspectj
spring-aop
Rejeev Divakaran
quelle
quelle
Antworten:
Sie sollten einen Typ-Pointcut mit einem Methoden-Pointcut kombinieren.
Diese Pointcuts erledigen die Arbeit, um alle öffentlichen Methoden in einer Klasse zu finden, die mit einer @ Monitor-Annotation gekennzeichnet ist:
Beraten Sie den letzten Pointcut, der die ersten beiden kombiniert, und Sie sind fertig!
Wenn Sie interessiert sind, habe ich hier einen Spickzettel im @AspectJ-Stil mit einem entsprechenden Beispieldokument hier geschrieben.
quelle
Verwenden von Anmerkungen, wie in der Frage beschrieben.
Anmerkung:
@Monitor
Anmerkung zur Klasse
app/PagesController.java
:Anmerkung zur Methode
app/PagesController.java
:Benutzerdefinierte Anmerkung ,
app/Monitor.java
:Aspekt für Annotation ,
app/MonitorAspect.java
:AspectJ aktivieren ,
servlet-context.xml
:AspectJ-Bibliotheken einschließen ,
pom.xml
:quelle
Monitor
ein Frühling seinComponent
?Component
Anmerkung wird verwendet, um den Spring-Container anzuweisen, die Klasse in die AspectJ-Weber-Sache aufzunehmen. In der Standardeinstellung Frühling sieht nur aufController
,Service
und andere spezifische Anmerkungen, aber nichtAspect
.@Component
Anmerkung auf der@interface
nicht die gesprochenAspect
. Warum wird das benötigt?@Component
Annotation macht es so, dass Spring es mit dem aspektorientierten AspectJ IoC / DI-System kompiliert. Ich weiß nicht, wie ich es anders sagen soll. docs.spring.io/spring/docs/3.2.x/spring-framework-reference/…Sowas in der Art:
Beachten Sie, dass Sie vor dieser Klasse keine weiteren Ratschläge zu derselben Klasse haben dürfen , da die Anmerkungen nach dem Proxy verloren gehen.
quelle
Verwenden
quelle
Es sollte ausreichen, Ihre Aspektmethode wie folgt zu markieren:
Schauen Sie sich dies an, um eine schrittweise Anleitung dazu zu erhalten.
quelle
Sie können den Pointcut auch als definieren
quelle
execution(public * @Monitor *.*(..))
funktioniert.Der einfachste Weg scheint zu sein:
Die Ausführung aller Methoden, die speziell mit '@MyHandling' in der Klasse 'YourService' versehen sind, wird abgefangen. Um alle Methoden ausnahmslos abzufangen, fügen Sie die Anmerkung einfach direkt in die Klasse ein.
Unabhängig vom privaten / öffentlichen Bereich hier, aber denken Sie daran, dass spring-aop keinen Aspekt für Methodenaufrufe in derselben Instanz verwenden kann (normalerweise private), da in diesem Fall die Proxy-Klasse nicht verwendet wird.
Wir verwenden hier @ Round-Ratschläge, aber es ist im Grunde die gleiche Syntax wie bei @Before, @After oder anderen Ratschlägen.
Die @ MyHandling-Annotation muss übrigens folgendermaßen konfiguriert werden:
quelle
// perform actions after
wird nie aufgerufen, da wir den Wert in der vorherigen Zeile zurückgeben.Sie können den PerformanceMonitoringInterceptor von Spring verwenden und den Hinweis mithilfe eines Beanpost-Prozessors programmgesteuert registrieren.
quelle
Aus dem Frühling
AnnotationTransactionAspect
:quelle