Betrachten Sie zwei in ABC.java definierte Methoden:< ;/p>
<br>public void method1() {</p> <pre class="brush:php;toolbar:false">method2();
}
public void method2() {}
< ;/pre>
Um AOP auf Methode2-Aufrufe anzuwenden, haben Sie eine AOPLogger.java-Klasse mit einer checkAccess-Aspektmethode definiert. In Ihrer Konfigurationsdatei:
<br><bean id="advice" class="p.AOPLogger" /><br><aop:config> </p> <pre class="brush:php;toolbar:false"><aop:pointcut id="abc" expression="execution(*p.ABC.method2(..))" /> <aop:aspect id="service" ref="advice"> <aop:before pointcut-ref="abc" method="checkAccess" /> </aop:aspect>
Wenn jedoch Methode2 aufgerufen wird, wird die checkAccess-Methode in AOPLogger nicht ausgelöst.
Der AOP-Aspekt wird auf einen Proxy angewendet, der die Bean umgibt. Wenn Sie einen Verweis auf eine Bean erhalten, arbeiten Sie nicht tatsächlich mit der in Ihrer Konfiguration angegebenen Klasse. Stattdessen wird Ihnen eine synthetische Klasse präsentiert, die die entsprechenden Schnittstellen implementiert, Aufrufe delegiert und zusätzliche Funktionalität bereitstellt (z. B. Ihr AOP).
In diesem Fall sind Sie es direktes Aufrufen von Methode2 für die Klasse. Wenn die Instanz dieser Klasse als Spring-Bean in eine andere Bean eingefügt würde, würde sie als Proxy eingefügt. Infolgedessen würden alle Methodenaufrufe an den Proxy weitergeleitet (und die Aspekte würden ausgelöst).
< p>Um dieses Problem zu beheben, ziehen Sie die folgenden Optionen in Betracht:
<li>Separate method1 and method2 into distinct beans.</li> <li>Employ a non-Spring AOP framework.</li>
Das obige ist der detaillierte Inhalt vonWarum fängt mein Spring AOP Methodenaufrufe innerhalb einer anderen Methode nicht ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!