6

すべてのメソッド呼び出しをインターセプトするアスペクトを持つ JAR が必要です。

@Aspect
public class CoolAspect {
    @Pointcut("execution(public * *(..))")
    public void anyPublicMethod() { }

    @Before("anyPublicMethod()")
    public void advice(JoinPoint point) {
       System.out.println("sign:\t" + point.getSignature());
    }
}

上記が私が持っていて、クライアントに使用してもらいたいアスペクトであるとします。これを JAR にコンパイルし、Maven で使用できるようにします。

これで、クライアントはこの jar を依存関係として使用します。

    <dependency>
        <groupId>cool-group</groupId>
        <artifactId>cool-artifact</artifactId>
        <version>1.0.0</version>
    </dependency>

この成果物 (JAR) には、前述の側面があります。

Maven依存関係を宣言するだけで、アスペクトの作業が可能になりましたか?

重要かもしれないいくつかのこと:

  1. AspectJ (必要に応じておそらく Spring AOP) を使用する予定です。
  2. クライアントは、おそらく通常の Web アプリケーションweb.xmlなどになります。
  3. クライアントはMavenで構築されています
  4. クライアントをできるだけ簡単に構成できるようにしたいと考えています。当初の考えでは、Maven の依存関係で十分でした。
  5. 「アノテーション JAR」には Web フラグメントが含まれるため、ServletContextListenerそこでカスタムを宣言することができます。

何か案は?

4

2 に答える 2

3

spring-boot を使用している場合は、この質問に対する簡単な解決策を見つけてください。

jar では、アスペクトをコンポーネントとして定義できます。

package com.xxx.yy.zz.aspect;
@Aspect
@Component
public class CoolAspect {
   // code like the question
}

spring.factoriesそして、でファイルを作成する必要があります/resources/META-INF/。Spring は、開始時にこのファイルをスキャンします。

そしてファイルspring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.xxx.yy.zz.aspect.CoolAspect

その後、それらを jar としてパッケージ化するだけです。

これは、Maven の依存関係を宣言するだけで機能します

于 2019-11-06T07:54:39.800 に答える
2

いいえ、これは不可能です。クライアント クラスの前に AspectJ を開始する必要があるためです。すべてのクライアント クラスは、注釈を処理する特別な拡張クラス ローダーを介してロードする必要があります。

もう 1 つは、Spring の AOPです。アプリケーションコンテキストの起動中にビーンを織り、特別なクラスローダーを必要としません。クライアントが春を使用している場合、それがクライアントにとって最も簡単な方法です。Maven 依存関係を追加し、アプリケーション コンテキストで AOP を構成します。

織り方には次の4種類があります。

  • コンパイル時のウィービングは、最も単純なアプローチです。アプリケーションのソース コードがある場合、ajc はソースからコンパイルし、出力として織り込まれたクラス ファイルを生成します。ウィーバーの呼び出しは、ajc コンパイル プロセスに不可欠です。アスペクト自体は、ソース形式またはバイナリ形式の場合があります。影響を受けるクラスをコンパイルするためにアスペクトが必要な場合は、コンパイル時に織り込む必要があります。たとえば、クラスにメンバーを追加し、コンパイルされている他のクラスが追加されたメンバーを参照する場合などに、アスペクトが必要になります。
  • ポストコンパイル ウィービング (バイナリ ウィービングとも呼ばれます) は、既存のクラス ファイルと JAR ファイルをウィービングするために使用されます。コンパイル時のウィービングと同様に、ウィービングに使用されるアスペクトはソース形式またはバイナリ形式である場合があり、それ自体がアスペクトによって織り込まれる場合があります。
  • Load-time weaving (LTW) は、クラス・ローダーがクラス・ファイルをロードしてクラスを JVM に定義するまで延期される単純なバイナリー・ウィービングです。これをサポートするには、ランタイム環境によって明示的に提供されるか、「ウィービング エージェント」を介して有効化される、1 つ以上の「ウィービング クラス ローダー」が必要です。
  • ランタイム ウィービング、これは実際に Spring が行っていることです。これを、すでに定義されているクラスの織り込みと定義します。JVMに
于 2013-12-19T11:59:50.983 に答える