ホームページ  >  記事  >  Java  >  AOP アスペクトが入れ子になったメソッド呼び出しで呼び出されないのはなぜですか?

AOP アスペクトが入れ子になったメソッド呼び出しで呼び出されないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-31 15:51:02325ブラウズ

Why is my AOP Aspect Not Invoked in Nested Method Calls?

ネストされたメソッド呼び出しと Spring AOP

ABC.java の次のコードを考えてみましょう:

<code class="java">public void method1() {
    // ...
    method2();
    // ...
}

public void method2() {
    // ...
    // ...
}</code>

AOP をメソッド 2 に追加するには、アスペクトの作成が必要です、AOPLogger、アクセスをチェックするためのメソッド、checkAccess が含まれています。 Spring 構成には次のものが含まれます。

<code class="xml"><bean id="advice" class="p.AOPLogger" />
<aop:config>
    <aop:pointcut id="abc" expression="execution(*p.ABC.method2(..))" />
    <aop:aspect id="service" ref="advice">
        <aop:before pointcut-ref="abc" method="checkAccess" />
    </aop:aspect>
</aop:config></code>

ただし、アスペクト checkAccess は、method2 が呼び出されたときに呼び出されません。何が足りないのでしょうか?

AOP プロキシと Bean インジェクション

AOP は、Bean を囲むプロキシにアスペクトを適用することで機能します。 Bean が参照されるとき、それはインスタンス化されたクラスではなく、実際のクラスに委任され、AOP などの機能を追加する合成クラスです。

この例では、method2 がクラスで直接呼び出されます。 Spring Bean として注入されると、外側のクラスがそのプロキシとして注入され、メソッド呼び出しのアスペクトをトリガーします。

ネストされたメソッド呼び出しで AOP を呼び出すには、次のオプションを考慮してください:

  1. Bean の分離: Method1 と Method2 を別々の Bean に分割します。
  2. 非 Spring AOP フレームワーク: 非 Spring 指向の AOP フレームワークを利用して、より詳細に制御します。アスペクト アプリケーション。

Spring のドキュメントには、詳細と考えられる回避策が記載されています。

以上がAOP アスペクトが入れ子になったメソッド呼び出しで呼び出されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。