Frühling AOP
Hier sind die Punkte, die Sie über Spring AOP erinnern sollte,
-
Aufgrund der Proxy-basierten Natur des Spring AOP Framework Anrufe innerhalb des Ziel Objekt sind per Definition nicht abgefangen.
-
Für JDK Proxies, nur öffentliche Interface-Methode ruft die Proxy kann sein abgefangen. Mit CGLIB, öffentliche und geschützt Methode fordert den Proxy wird abgefangen und sogar Paket sichtbare Methoden, falls erforderlich.
können Sie mehr here finden.
- Da Ihre Methode
myMethod
privaten ist, wird der Anruf zu myMethod
nicht abgefangen werden. Bitte beachten Sie den oben genannten zweiten Punkt.
- Selbst wenn Ihr
myMethod
war öffentliche, würde der Aufruf von myMethod
nicht abgefangen werden kann, wenn der Anruf über schedule
Verfahren hergestellt wurde. Bitte beachten Sie den oben genannten ersten Punkt.
- Nun, wenn Ihre
myMethod
öffentlichen, der Anruf an myMethod
ist, würde abgefangen werden, wenn der Anruf direkt an myMethod
Methode von außerhalb des Objekts durchgeführt wurde.
AspectJ Quelle Weaving
Allerdings können Sie private Methoden abfangen durch die Nutzung von AspectJ Quelle Weben nehmen. Beim Quellenweben wird der Weber Teil des Compilers. Der Weber agiert als Compiler, indem er den Quellcode verarbeitet und einen gewebten Java-Bytecode generiert. Anstelle des javac
Compilers verwendet es ajc
Compiler.
Hier sind die Änderungen, die Sie vornehmen müssen:
- hinzufügen Maven
aspectj-maven-plugin
-Plugin auf Ihre pom.xml
Wie unten gezeigt, Änderungen an der pointcut von MyAspect
privaten Methoden umfassen.
@Component
@Aspect
public class MyAspect {
@Before("@annotation(myAnnoAnnotation) && execution(private * *(..))")
public void myAnnoAspect(JoinPoint jp, MyAnno myAnnoAnnotation) {
...
}
}
Sie finden ein komplettes Arbeitsbeispiel here.
Was genau ist die Frage hier. Kannst du klar sein? Sie haben '@ scedduled' auf einer anderen Methode und' @MyAnno' auf einer anderen Methode. Wie ist es wichtig? – pvpkiran
Die Methode myAnnoAspect wird nie nach dem Aufruf von myMethod ausgeführt. Ich habe die gleiche Klassenstruktur für eine andere Annotation und sie funktioniert (ohne @Scheduled). –
Sie haben '@ Before' Annotation, dh' myAnnoAspect' sollte vor 'myMethod' ausgeführt werden – pvpkiran