around、beforeおよびafterの3つのアドバイスがあるとします。
1)before/afterが呼び出されたときにproceedがaroundアドバイスで呼び出されたとき、または呼び出されたときbefore/after = around全体としてのアドバイス?
2)aroundアドバイスがproceedを呼び出さない場合、before/afterアドバイスはとにかく実行されますか?
このテストで
@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);
}
}
次の出力があります
そのため、前/後が呼び出されていないことがわかります
Que:2)私のアラウンドアドバイスが先に進むことを呼び出さない場合、ビフォー/アフターアドバイスはとにかく実行されますか?
回答:アラウンドアドバイスの中で進めを呼び出さない場合、コードの実行と同様にビフォーアドバイスはスキップされますが、アフターアドバイスは実行されますが、アフターアドバイスがそのメソッドの値を使用する場合、すべてがnullになります。そのアドバイスを使う意味はまったくありません...
願って、私は手伝った。