2017-11-02 2 views
0

Warum wird der Aspekt einer Anmerkung nicht verwendet, wenn er auf eine Methode von cron gesetzt ist.Aspekt erfasst keine Methode von Geplant

@Component 
public class MyClass { 
    @Scheduled(cron = "0/5 * * * * ?") 
    public void schedule() { 
    myMethod("test"); 
    } 

    @MyAnno(cl = MyClass.class, description = "desc") 
    private void myMethod(String text) { 

    } 
} 

@Aspect 
@Component 
public MyAscpect { 
    @Before("@annotation(myAnnoAnnotation)") 
    public void myAnnoAspect(JoinPoint jp, MyAnno myAnnoAnnotation) { 
} 
+0

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

+0

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). –

+0

Sie haben '@ Before' Annotation, dh' myAnnoAspect' sollte vor 'myMethod' ausgeführt werden – pvpkiran

Antwort

0

Frühling AOP

Hier sind die Punkte, die Sie über Spring AOP erinnern sollte,

  1. Aufgrund der Proxy-basierten Natur des Spring AOP Framework Anrufe innerhalb des Ziel Objekt sind per Definition nicht abgefangen.

  2. 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 myMethodprivaten 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 MyAspectprivaten 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.

Verwandte Themen