2

私は本当に AOP に頭を悩ませ始めており、分野横断的な懸念を抽象化し、コア ビジネス コードからそれを削除するというアイデアが本当に気に入っています。これまでのところ、AOP Alliance (Guice と Spring AOP の主力製品であることがわかります) と AspectJ について調べてきました。

残念ながら、単純なメソッド インターセプトよりも高度なものについて話している場合、適切に動作する Java AOP コードの例を見つけるのは困難です。永続性、トランザクション処理、メッセージングなどの主要な Java EE 概念を AOP で実装する方法を何度も何度も読み続けていますが、私の人生では、この例を見つけることができません!

最終的に言えば、AOP は結局のところ、メソッド インターセプトに要約されます (ここで何か重大なことが抜けていない限り)。その場合、メソッド インターセプターの一般的な形式を考えると、次のようになります。

// Using AOP Alliance for this example
public class MyInterceptor implements MethodInterceptor {
    public Object invoke(MethodInvocation inv) {
        // Run this code before executing inv.
        preInvocation();

        Object result = inv.proceed();

        // Run this code after executing inv.
        postInvocation();
    }

    // ...
}

出発点として、メソッドインターセプトを介してこれらの Java EE 概念のそれぞれを AOP に委譲する方法の具体的なコード例を提供してください。

  • 永続性/ORM
  • 取引処理
  • メッセージング

すべての点を結びつけ、「木」を通して「森」を見るのが難しいだけだと思います。前もって感謝します!

4

2 に答える 2

3

永続性とメッセージングについてはわかりませんが、トランザクションについては説明できます。春の例を取り上げます。

Spring Bean (通常はサービス レイヤー Bean) を構成して、これらの Bean で呼び出されるすべてのメソッドがトランザクション インターセプターによってインターセプトされるようにすることができます。このインターセプターは通常、次のことを行います。

  • トランザクションが現在のスレッドに既にバインドされているかどうかを確認する
  • そうでない場合は、トランザクションを開始して現在のスレッドにバインドします
  • メソッドを呼び出す
  • トランザクションがこのメソッドのインターセプトによって開始され、メソッドによって実行時例外がスローされなかった場合、トランザクションをコミットします
  • トランザクションがこのメソッド インターセプトによって開始され、実行時例外がメソッドによってスローされた場合、トランザクションをロールバックします。
  • 現在のスレッドからトランザクションをバインド解除します

トランザクションの側面がない場合、トランザクション メソッドは次のようにする必要があります。

try {
    userTransaction.begin();
    executeSomeBusinessCode();
    userTransaction.commit();
}
catch (RuntimeException e) {
    userTransaction.rollback();
}

これは面倒で、エラーが発生しやすく、トランザクションの伝播や新しいトランザクションなども処理しません。

AOP では、メソッドの本体は次のようになります。

executeSomeBusinessCode();
于 2012-06-08T12:10:37.103 に答える
1

「メッセージング」と「永続性」の意味がわからない - どのようなメッセージを送信したいですか? 何を持続したいですか?

メソッド呼び出しの結果を非常に簡単に保持したい場合は、MethodInterceptor を実装します。

public Object invoke(MethodInvocation invocation) throws Throwable {
    Object result = invocation.proceed();
    myPersistenceMethod(invocation, result);
    return result;
}

次に、アノテーションを定義し、アノテーション付きメソッドのメソッド結果を永続化できます。たとえば、Guice モジュールでは次のようになります。

 bindInterceptor(Matchers.any(), Matchers.annotatedWith(MyPersistenceAnnotation.class),
            new MyPersistenceInterceptor());

主な問題は、永続性の「キー」を構築する方法です。最も明白なことは、呼び出しメソッドと引数ですが、これはすべてリフレクション ベースであるため、特定のメソッドに特定の引数があると想定し始める場合、コンパイル時のチェックはありません。 .

それがどのように役立つか。

于 2012-06-12T14:42:55.063 に答える