考虑 ABC.java 中定义的两个方法:
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" /><br><aop:config> </p><div class="code" style="position:relative; padding:0px; margin:0px;"><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 中,那么它将作为代理注入。因此,任何方法调用都将定向到代理(并且将触发方面)。
< p>要解决此问题,请考虑以下选项:
<li>Separate method1 and method2 into distinct beans.</li> <li>Employ a non-Spring AOP framework.</li>
以上是为什么我的 Spring AOP 不拦截另一个方法中的方法调用?的详细内容。更多信息请关注PHP中文网其他相关文章!