4

私はaspectjでRESTサーバーを構築しています。同期のために私はアスペクトを使いたいです。このようなポイントカットを定義して、更新イベントと削除イベントが発生するすべてのポイントをキャプチャしました。アノテーションを定義し、アノテーションを使用して同期するメソッドをキャプチャしました。

synchronized pointcut syncJoinPoints():call (@Synchronizes * *(..));

ポイントカットが同期された場合はどうなりますか、ポイントカットが同期されたとはどういう意味ですか。ポイントカットをインターセプトするスレッドは、AspectJプラグインによって新しく作成されたものですか、それともインターセプトされたメソッドに入るスレッドを使用しますか?

ご協力ありがとうございました。

4

1 に答える 1

5

AspectJ はそれ自体ではスレッドを作成しません。ウィービングは、いくつかの追加の命令を挿入することによって「のみ」コードを変更しますが、同じコンテキストで実行し続けます。

ポイントカット定義のsynchronizedキーワードは、何の役にも立たない。達成したいことが@Synchronizes、同じロックで注釈が付けられたメソッドへのすべての呼び出し (または実行。つまり、コードの変更が少ないことを意味します) を同期することである場合は、次のアドバイスが必要です。

public aspect SynchronizingAspect {
    private static final Object lock = new Object();

    pointcut syncJointPoint(): execution(@Synchronizes * *.*(..)); // or call()

    Object around(): syncJointPoint() {
        synchronized(lock) {
            return proceed();
        }
    }
}
于 2012-12-17T16:56:11.983 に答える