2

私はSpring AOPの初心者です。私はその背後にある概念を理解しており、@Before または @After などの使用法の概念も理解しています。私がとても混乱しているのは、Spring AOP の使用です。クラスの以下のメソッドを考えてください。

public void test(int x) {
       :
       x++;
       logger.info("This is a test" + x);
       :
       try {
                   :
       } catch (Exception e) {
           throw new ...
       }
       :
}

ログをキャプチャする古い方法は、上記のとおりです。ここに私の質問があります:

  1. Spring AOP を使用して上記のメソッドを実装した場合、このロガーは削除されますが、Spring AOP はこのログ メッセージをキャプチャできますか? (私が知っていることから、Spring AOPはメソッド内を調べません)

  2. 条項 1) への回答が「はい」の場合、それはどのように行われますか?

  3. 答えが「いいえ」の場合、Spring AOP を使用する意味は何ですか。メソッドの実行前にパラメーターなどの情報を取得する場合を除き、@Before の使用は役に立ちません。ほとんどの場合、メソッド自体の内部で何らかのログを取得したいと考えています。

AspectJのことは忘れてください。AspectJが上記の仕事をできることは知っています。メソッド内でログをキャプチャするという非常に基本的なことを実行できない場合、Spring AOP を使用する意味を知りたいだけです。

どんな助けでも大歓迎です。


さらに注意:

Spring AOP を実装した後、上記のコードは次のようになると思います。ロガー呼び出しは、アスペクト クラスによって処理されるため、テスト メソッドには含まれなくなりました。それが AOP の目的ではないでしょうか。オブジェクトから横断的な懸念を取り除き (オブジェクトの実際のサービスとは関係がないため)、アスペクト クラスによって処理されるには?

public void test() {

       :
       try {
                   :
       } catch (Exception e) {
           throw new ...
       }
       :
}

Spring AOP がこれを実行できない場合、AOP を使用する意味は何ですか?

4

1 に答える 1

1

あなたがここで何を求めているのか理解に苦しむ. 一般に、「メソッド内でログをキャプチャする」とはどういう意味かはわかりませんが、何らかの支援を提供できると思います。

必ずしもメソッドの最初または最後ではなく、メソッド内のランダムなポイントにコードを任意に挿入したいように思えます。一般に、Spring AOP はこれを行うことができず、AspectJ がいずれかを支援できるかどうかはわかりませんが、決定的な答えを与えるにはあまり詳しくありません。

あなたが言ったように、Spring AOP は、コードベースのさまざまな JoinPoints の前/後/前後に挿入できます。これらの JoinPoints はメソッドになり、Spring 管理クラスでのみ使用されます。

したがって、次のようなメソッドがある場合は、アスペクトSystem.outを介してその周りにロギング (この場合は via)を追加できます。@Around

コード:

public void test() {
    System.out.println("I am in a method now");
}

アスペクト:

@Around("execution(public * *(..))")
public void publicMethods(ProceedingJoinPoint pjp) {
    System.out.println("before in an aspect");
    pjp.proceed();
    System.out.println("after in an aspect");
}

これにより、基本的に初期メソッドが次のようになります (これらSystem.outをすべてのパブリック メソッドに追加するだけでなく):

public void test() {
    System.out.println("before in an aspect");
    System.out.println("I am in a method now");
    System.out.println("after in an aspect");
}

コードのレイアウトによっては、挿入したいポイントにメソッドを作成することで、効果的に任意に挿入できる場合があります。これはお勧めしませんが、確かに可能です。

最後に、ご質問に対する回答を以下に示します。

  1. @Beforeロギング行がメソッドの最初のコードであると仮定すると、ロガーをアスペクトに置き換えることができます。これを行うと、メソッド内からロギングを削除できます。最後の文で何を求めているのかよくわかりませんが、いいえ、Spring AOP はメソッドの「内部」を見ません。
  2. Spring はクラスをプロキシするため、Spring AOP はそれを「キャプチャ」できます。
  3. Spring AOP のポイントは、メソッド呼び出しを「インターセプト」できるようにすることです。実際の用途は見えないかもしれませんが、非常に便利です。Spring AOP を使用する場合、自分のメソッドに何が入っているのか、何が出てくるのかを調べたいと思っています。

編集:

あなたは正しいです。ログ呼び出しを削除して、側面で処理することができます。注意しなければならないことは、ログ メソッドがアスペクトによって呼び出される唯一の機会は、実際のメソッド呼び出しの前後のいずれかであるということです。

于 2013-03-18T00:54:48.387 に答える