web-dev-qa-db-fra.com

AspectJ "autour" et "procéder" avec "avant/après"

Disons que vous avez trois conseils: autour , avant et après .

1) Est-ce que avant/après est appelé quand continue est appelé dans le autour conseil, .__ ou est-il appelé avant/après le autour conseil comme un ensemble?

2) Si mon autour conseil n'appelle pas procède , Le avant/après conseil sera-t-il exécuté de toute façon?

27
Gérald Croës

Avec ce test

@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);
    }
}

j'ai la sortie suivante

  1. dans environ avant l'exécution (void aspects.TestAspect.hello ()) 
  2. avant exécution (void aspects.TestAspect.hello ()) 
  3. bonjour
  4. après exécution (void aspects.TestAspect.hello ())
  5. dans environ après l'exécution (void aspects.TestAspect.hello ())
  6. dans environ avant l'exécution (void aspects.TestAspect.hello ())
  7. dans environ après l'exécution (void aspects.TestAspect.hello ())

afin que vous puissiez voir avant/après ne sont pas appelés

38
Frank M.

Que: 2) Si mes conseils ne suivent pas, le conseil avant/après sera-t-il exécuté de toute façon?

Réponse: Si vous n'appelez pas, suivez votre conseil avant et votre exécution du code sera ignorée, mais votre conseil après sera exécuté. Mais si votre conseil après utilise une valeur de cette méthode, tout sera nul. Donc pratiquement il n'y a aucune raison d'utiliser ce conseil du tout ...

J'espère que j'ai aidé.

0
user9759184