考慮ABC.java 定義的兩個方法:
<br>public void method1() {<pre class="brush:php;toolbar:false">method2();
}
public void method2() {}
<🎜>< ;/pre>
要在method2 呼叫上套用AOP,您已經定義了一個帶有checkAccess 切面方法的AOPLogger.java 類別。在您的設定檔中:
<br><bean id="advice" class="p.AOPLogger"></bean><br><config> <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>
但是呼叫method2時,並沒有觸發AOPLogger中的checkAccess方法。
AOP 方面應用於圍繞 bean 的代理。當您取得 bean 的參考時,您實際上並未使用組態中指定的類別。相反,您會看到一個合成類,它實現適當的介面、委託呼叫並提供附加功能(例如,您的 AOP)。
在這種情況下,您是直接呼叫類別的method2。如果該類別的實例作為 Spring bean 注入到另一個 bean 中,那麼它將作為代理注入。因此,任何方法呼叫都將定向到代理(並且將觸發方面)。
要解決此問題,請考慮以下選項:
<li>Separate method1 and method2 into distinct beans.</li> <li>Employ a non-Spring AOP framework.</li>
以上是為什麼我的 Spring AOP 不攔截另一個方法中的方法呼叫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!