0

以下に示すコードのように、Web アプリで Spring AOP フレームワークを使用するクラスがあります。次のコードを実装すると、Spring AOP が add() をトレースできたのに、multiple() をトレースできなかったのはなぜだろうと思っていました。

public interface calculator {
   public void add();
   public void multiple();
}

public class calculatorImpl implements calculator {

   public void add() {

      multiple();
   }

   public void multiple() {}
}

実験を行ったところ、次のコードが正常に機能することがわかりました。Spring AOP が追加機能と複数機能の両方をトレースできることを意味します。

ICalculator calcProxy = (ICalculator) context.getBean("calculatorProxy");
calcProxy.add();
calcProxy.multiple();

multiple()これは、プロキシ Bean によって注入されたことが原因であるに違いないと思いますが、 multiple()incalculatorImplクラスはそうではなかったので、Spring AOP はそれを追跡できませんでした。私が間違っている場合は修正してください。

私の次の質問。Spring AOP でadd()実際に実行してトレースを取得する必要があるこの問題の回避策はありますか?multiple()

4

1 に答える 1

2

Spring AOP は実際のメソッドを変更しませんが、オブジェクトの周りにプロキシを追加します。内側のオブジェクト (add()メソッドの内側) に入ると、プロキシはなくなり、その下になります。

この過去の回答で、このメカニズムについて詳しく説明しました。

https://stackoverflow.com/a/4171649/342852

このような状況に対処するには、次の 3 つの方法があります。

  1. Spring AOP ではなくAspectJを使用します。AspectJ は動作をコードにコンパイルしますが、Spring AOP はコードを囲むプロキシで動作します。
  2. Bean 内からプロキシにアクセスします。これは非常に醜いですが、実行できます。
    コード例 (ここでは、クラスがプロキシされていることをクラスに認識させます。これは、AOP が表すすべてのものに反しています):

    public void add() {
       ((Calculator)AopContext.currentProxy()).multiple();
    }
    

    やや恐ろしくありません (ここでは、Spring によって管理されていることをクラスに認識させます)。

    @Autowired
    private ApplicationContext context;
    public void add() {
       context.getBean(Calculator.class).multiple();
    }
    
  3. デザインを変更します。例: 2 つのメソッドを移動して Bean を分離し、それぞれを他の Bean に注入します。
于 2012-07-05T14:56:04.077 に答える