ホームページ  >  記事  >  Java  >  AOP アスペクトが Spring でネストされたメソッド呼び出しをトリガーしないのはなぜですか?

AOP アスペクトが Spring でネストされたメソッド呼び出しをトリガーしないのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-01 01:40:281015ブラウズ

Why Doesn't My AOP Aspect Trigger for Nested Method Calls in Spring?

Spring でのネストされたメソッド呼び出しの AOP エラーのトラブルシューティング

ABC.java クラス内では、method1() と method2 という 2 つのメソッドが定義されています。 ()。目標は、method2() 呼び出しに AOP を実装することです。

1 つのアプローチには、checkAccess() アスペクト メソッドを使用して AOPLogger.java クラスを作成することが含まれます。設定ファイルでは、アドバイス Bean が定義され、method2() が呼び出される前に checkAccess() を呼び出すようにアスペクトが設定されています。

ただし、これらの設定にもかかわらず、method2() の場合、checkAccess() メソッドは呼び出されません。

根本原因:

Spring AOP では、Bean を囲むプロキシ オブジェクトにアスペクトが適用されます。 Bean インスタンスが取得されるとき、それは実際のクラスではなく、インターフェイスを実装し、AOP のような機能を追加した合成クラスです。

解決策:

現在のシナリオでは、 method1() は、method2() を直接呼び出します。メソッドがプロキシ オブジェクトで呼び出されないため、アスペクトはトリガーされません。

この問題を解決するには、2 つのオプションがあります。

  • method1() と method2() を分割します。別々の豆。これにより、アスペクトを、method2() の周囲のプロキシ オブジェクトに適用できるようになります。
  • プロキシ オブジェクトのメカニズムに依存しない、非 Spring 指向の AOP フレームワークを使用します。

説明:

Spring ドキュメントの「AOP プロキシについて」では、この動作について詳しく説明されており、回避策が提供されています。回避策の 1 つは、上で提案したように、メソッドを個別の Bean に分割することです。

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

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