web-dev-qa-db-ja.com

AspectJの「前後」と「前後」で「進む」

aroundbeforeおよびafterの3つのアドバイスがあるとします。

1)before/afterが呼び出されたときにproceedaroundアドバイスで呼び出されたとき、または呼び出されたときbefore/after = around全体としてのアドバイス?

2)aroundアドバイスがproceedを呼び出さない場合、before/afterアドバイスはとにかく実行されますか?

28
Gérald Croës

このテストで

@Aspect
public class TestAspect {
    private static boolean runAround = true;

    public static void main(String[] args) {
        new TestAspect().hello();
        runAround = false;
        new TestAspect().hello();
    }

    public void hello() {
        System.err.println("in hello");
    }

    @After("execution(void aspects.TestAspect.hello())")
    public void afterHello(JoinPoint joinPoint) {
        System.err.println("after " + joinPoint);
    }

    @Around("execution(void aspects.TestAspect.hello())")
    public void aroundHello(ProceedingJoinPoint joinPoint) throws Throwable {
        System.err.println("in around before " + joinPoint);
        if (runAround) {
            joinPoint.proceed();
        }
        System.err.println("in around after " + joinPoint);
    }

    @Before("execution(void aspects.TestAspect.hello())")
    public void beforeHello(JoinPoint joinPoint) {
        System.err.println("before " + joinPoint);
    }
}

次の出力があります

  1. 実行前の前後(voidアスペクト.TestAspect.hello())
  2. 実行前(void aspects.TestAspect.hello())
  3. こんにちは
  4. 実行後(void aspects.TestAspect.hello())
  5. 実行後の周り(voidアスペクト.TestAspect.hello())
  6. 実行前の前後(voidアスペクト.TestAspect.hello())
  7. 実行後の周り(voidアスペクト.TestAspect.hello())

そのため、前/後が呼び出されていないことがわかります

38
Frank M.

Que:2)私のアラウンドアドバイスが先に進むことを呼び出さない場合、ビフォー/アフターアドバイスはとにかく実行されますか?

回答:アラウンドアドバイスの中で進めを呼び出さない場合、コードの実行と同様にビフォーアドバイスはスキップされますが、アフターアドバイスは実行されますが、アフターアドバイスがそのメソッドの値を使用する場合、すべてがnullになります。そのアドバイスを使う意味はまったくありません...

願って、私は手伝った。

0
user9759184