3

Jboss AOP (プロキシベース) を使用しているアプリケーションを、コンパイル時の織り込みで AspectJ AOP に移行しています。ただし、内部メソッドが AspectJ によってインターセプトされることは望ましくありませんが、それが AspectJ のデフォルトの動作のようです。

Spring AOP で内部メソッド呼び出しをインターセプトする方法については、複数の投稿があります。ただし、AspectJ を使用した内部メソッドの除外に関する投稿は見つかりませんでした。AspectJ のコンパイル時ウィービングを使用して、約束されているランタイム パフォーマンスの向上を実現したいと考えています。

別のクラスのメソッドが以下のクラス TestService のパブリック メソッドを呼び出す場合、その呼び出しはインターセプトされる必要があります。ただし、me​​thod1() から method2() への内部呼び出しは傍受されるべきではありません。インターセプターがオブジェクトごとに 1 回だけインターセプトするようにしたいだけです。

public class TestService {
  public void method1() {
    …
    // We do not want the below internal call to be intercepted. 
    this.method2();
  }

  // If some other class's method calls this, intercept the call. But do not intercept the call from method1().
  public void method2() {
    ...     
  }
}

アスペクトの例:

@Aspect
public class ServiceAspectJHydrationInterceptor {
    @Pointcut("execution(public * com.companyname.service..impl.*ServiceImpl.*(..))")
    public void serviceLayerPublicMethods() {}

    @Pointcut("@annotation(com.companyname.core.annotation.SkipHydrationInterception)")
    public void skipHydrationInterception() {}

    @Around("serviceLayerPublicMethods() && !skipHydrationInterception()")
    public Object invoke(ProceedingJoinPoint pjp) throws Throwable {
        …
    }
}

Spring AOP はプロキシ ベースであるため、内部メソッド呼び出しインターセプトを除外する動作がデフォルトです。AspectJ とコンパイル時の織り方を使用して、内部メソッドのインターセプトを除外する方法はありますか?

ソフトウェアの詳細: Spring バージョン: 3.2.14。JDK バージョン: 1.8。Maven プラグイン コードハウス「aspectj-maven-plugin」バージョン 1.7 は、コンパイル時のウィービングを行うために使用されます。

4

1 に答える 1