3

AOP (AspectJ、SpringAOP など) が、以下のメソッド周辺のポイントカットでクロスカットの問題を処理 (アドバイス) すると便利です。

「サンドイッチ」コード

methodA {
    crosscut code
    user code A
    crosscut code
}

methodB {
    crosscut code
    user code B
    crosscut code
}

AOP は、以下のユーザー コードに重複する懸念事項をクロスカットする傾向がありますか? どのように?

「スパゲッティ」コード

methodX {
    user code x1
    crosscut code

    user code x2
    crosscut code
}

methodY {

    user code y1
    crosscut code

    user code y2
    crosscut code
}

ありがとう!

4

2 に答える 2

4

execution() ポイントカットのみを理解するため、Spring AOP は役に立ちません。

AspectJ には、あなたが望むもののように聞こえる withincode() コンストラクトを含む、より多くのポイントカットが含まれています。

withincode(* YourClass.methodX(. .))

これにより、特定のメソッド実行内のすべての結合ポイントをアドバイスできます

詳細については、 AspectJ in Actionを参照してください。これは、AspectJ と Spring AOP の両方に関する非常に優れた本です。


編集:

ここにいくつかのサンプルコードがあります:

package com.dummy.aspectj;

import java.util.Arrays;
import java.util.Collections;

public class DummyClass{

    public static void main(final String[] args){
        System.out.println(Arrays.asList("One", Collections.singleton("Two")));
        System.out.println("Enough?");
    }

}

package com.dummy.aspectj;

import java.util.Arrays;

public aspect DummyAspect{

    pointcut callWithinMain() : 
        withincode(* com.dummy.aspectj.DummyClass.main(..)) // anything inside DummyClass.main
        && call(* *.*(..));                                 // but only method calls

    before() : callWithinMain() {
        System.out.println("\n***************************************************");
        System.out.println("** Calling:\n**\t"
            + thisJoinPointStaticPart.getSignature()
            + "\n** with arguments:\n**\t "
            + Arrays.deepToString(thisJoinPoint.getArgs()) );
        System.out.println("***************************************************\n");
    }

}

Eclipse / AJDT から DummyClass を実行すると、次の出力が生成されます。

***************************************************
** Calling:
**  Set java.util.Collections.singleton(Object)
** with arguments:
**   [Two]
***************************************************


***************************************************
** Calling:
**  List java.util.Arrays.asList(Object[])
** with arguments:
**   [[One, [Two]]]
***************************************************


***************************************************
** Calling:
**  void java.io.PrintStream.println(Object)
** with arguments:
**   [[One, [Two]]]
***************************************************

[One, [Two]]

***************************************************
** Calling:
**  void java.io.PrintStream.println(String)
** with arguments:
**   [Enough?]
***************************************************

Enough?
于 2010-08-17T16:21:44.153 に答える
2

一部の AOP 実装ではこれを実行できる場合がありますが、これは、メソッドの途中でクロスカットする必要がある場合、それらのメソッドをやりすぎている可能性があるため、これらのメソッドをより構成されたメソッドにリファクタリングする必要があることを示している可能性があります。そうすることで、次のようになります。

methodX 
{
    usercodemethod1();
    usercodemethod2();
}

usercodemethod1
{
    user code x1
    crosscut code
}

usercodemethod2
{
    user code x2
    crosscut code
}
于 2010-08-17T16:12:11.793 に答える