2017-03-14 2 views
0

Ich habe versucht, einen Pointcut zu definieren, der allen Methoden in einer Klasse entspricht, aber es hat nicht funktioniert. Ich habe mich bemüht, den Grund herauszufinden. Und ich fand schließlich den Fehlerpunkt des Pointcut-Ausdrucks, den ich definiert habe.Was bedeuten zwei aufeinanderfolgende Sternchen in Pointcut Ausdruck?

Folgendes ist der Anfang dessen, was ich zuerst definiert habe. (Funktioniert nicht)

@Pointcut("execution(** membership.data.MemberRepository.*(..))") 

Als ich gewußt hätte, die aufeinanderfolgenden zwei Sternchen in „Ausführung (**“ jede Zugriffsmodifikator und jeden Rückgabetyp, aber es nie einige Methoden angepasst, die irgendeine Art von Rückgabetypen hat dies wie:

public List<MemberVO> findByName(String name) { ... 

Auf der anderen Seite, angepasst es andere wie folgt aus:

public String print(String str) { ... 

und folgendes der Anfang der richtigen Möglichkeiten, es zu definieren, die ich herausgefunden habe diese Spiel. die oben genannten zwei Methodensignaturen und funktionieren gut.

@Pointcut("execution(public * membership.data.MemberRepository.*(..))") 

@Pointcut("execution(* membership.data.MemberRepository.*(..))") 

Was habe ich vermisst? Ich bemühte mich sehr, die Antwort zu finden, aber sie erschien nie. Bitte lassen Sie mich die genaue Bedeutung von wissen „Ausführung (**“

. Zugabe: Die vollständige Quelle der Aspekt Klasse

@Aspect 
public class PerformanceLogger { 

    @Pointcut("execution(* membership.data.MemberRepository.*(..))") 
    public void performance() {} 

    @Around("performance()") 
    public Object watchPerformance(ProceedingJoinPoint jp) { 
     try { 
      long st = System.nanoTime(); 
      Object obj = jp.proceed(); 
      System.out.println(jp.toShortString() + " called :" + (System.nanoTime() - st)); 
      return obj; 
     } catch (Throwable e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 
+0

Vielleicht ein Leerzeichen zwischen den beiden '*'? – Andreas

+0

@Andreas Ich habe versucht, ein Leerzeichen zwischen den beiden wie folgt zu setzen: "execution (* * .." und es verursachte eine Exception beim Initialisieren des Aspect-Beans mit dem Pointcut-Ausdruck. – ParkCheolu

+0

Warum teilen Sie nicht den vollständigen Pointcut und Methodensignaturen? Auf diese Weise erhalten Sie keine aussagekräftigen Antworten. Bitte lernen Sie [wie Sie eine Frage zu SO stellen können] (http://stackoverflow.com/help/how-to-ask) und stellen Sie [minimal, complete, und verifizierbares Beispiel] (http://StackOverflow.com/Help/Mcve). Danke. Oh, und übrigens: '**' hat überhaupt keine Bedeutung. Das kann ich dir schon sagen. Dein Problem ist in Der Teil, den du vor uns versteckst – kriegaex

Antwort

0

Wie ich in meinem Kommentar sagte: ** hat nichts zu bedeuten, Sie Glücklicherweise scheint der Parser es als äquivalent zu * zu interpretieren, aber Sie können nicht sicher sein. Eigentlich sollte es einen Syntaxfehler ergeben. Also bitte benutzen Sie es nicht, es ist bedeutungslos. Ihre Annahme über die Bedeutung ist nur falsch. * * blah(..) tut auch funktioniert nicht, es ist eine ungültige Syntax IMO sollte es in dem Buch "Frühling in Aktion" behoben werden, ich fand es auch dort.In der ganzen AspectJ-Dokumentation finden Sie nicht Som alles wie **.

Was Ihre Frage betrifft: Um alle Methodenausführungen für Klasse membership.data.MemberRepository zu erhalten, verwenden Sie den Pointcut execution(* membership.data.MemberRepository.*(..)). Du hast es schon selbst herausgefunden.

Verwandte Themen