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 ...
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).
Tags und Links java spring spring-aop pointcut