ABC.java で定義されている 2 つのメソッドについて考えてみましょう:< ;/p>
<br>public void method1() {</p> <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> <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 など) を提供する合成クラスが表示されます。
この場合、クラスでメソッド2を直接呼び出します。そのクラスのインスタンスが Spring Bean として別の Bean に注入された場合、そのインスタンスはプロキシとして注入されます。その結果、メソッド呼び出しはすべてプロキシに送信されます (そしてアスペクトがトリガーされます)。
< p>この問題に対処するには、次のオプションを検討してください:
<li>Separate method1 and method2 into distinct beans.</li> <li>Employ a non-Spring AOP framework.</li>
以上がSpring AOP メソッドが別のメソッド内のメソッド呼び出しをインターセプトしないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。