Spring Pointcut Designatoren Unterschiede (innerhalb vs Ausführung)

8

Bitte ... kann mir jemand erklären, was die Unterschiede zwischen den folgenden Spring Pointcut Designatoren sind?

Verwendung von "innerhalb des Punktwählers":

%Vor%

Verwendung von "execution pointcut designator":

%Vor%

Ich benutze den zweiten in meinen Web-Projekten (und ich denke, es ist der am meisten verwendete), das Problem, das ich mit diesem Ansatz gefunden habe, ist, dass es eine Menge Speicher im Heap verbraucht ...

Nachdem ich den "heap dump" des Anwendungsservers mit dem "eclipse memory analysator" analysiert habe, habe ich festgestellt, dass meine Anwendung 450 MB verbraucht und die Instanzen der Klasse "org.springframework.aop.aspectj.AspectJExpressionPointcut "30% dieser 450 MB verbrauchen. .

Jede Instanz von AspectJExpressionPointcut belegt ungefähr 6 MB, weil jede Instanz einen Cache von Übereinstimmungen mit Instanzen von java.lang.reflect.Method verwaltet und überraschend viele Java-Methoden zwischengespeichert werden (Methoden, die meine Pointcut Ausdruck erwähnt nicht).

Nach dem Lesen der Spring-Dokumentation entschied ich mich für den ersten Ansatz (innerhalb des Pointcut-Designators) und nun belegt jede Instanz von AspectJExpressionPointcut weniger Speicher.

Die Frage ist, dass ... was ist der Unterschied in der Leistung zwischen ihnen ...

Vielen Dank im Voraus ...

    
glazaror 28.12.2013, 16:32
quelle

1 Antwort

4

Die Spring-Dokumentation erklärt den Unterschied:

  
  • Ausführung - Für übereinstimmende Methodenausführungs-Join-Punkte ist dies der primäre Pointcut-Bezeichner, den Sie verwenden, wenn Sie mit Spring AOP
  • arbeiten   
  • innerhalb - begrenzt die Übereinstimmung mit Join-Punkten innerhalb bestimmter Typen (einfach die Ausführung einer Methode, die innerhalb eines passenden Typs deklariert wird, wenn   mit Spring AOP)
  •   

Mit anderen Worten, execution entspricht einer Methode und within entspricht einem Typ.

In diesem Fall sind deine Pointcuts ziemlich gleichwertig. Ihr within entspricht einem beliebigen Typ im Paket my.app.dao.impl und Ihr execution entspricht allen öffentlichen Methoden eines beliebigen Typs im Paket my.app.dao.impl .

Allerdings ist execution , denke ich, mit einem Interceptor für jede Matched-Methode (viele Objekte) implementiert, wobei within nur einen Interceptor benötigt, da es mit dem gesamten Typ übereinstimmt (sehr kleine Objekte).

    
Sotirios Delimanolis 28.12.2013 16:38
quelle

Tags und Links