2010-11-03 18 views
4

La documentation n'est pas très claire à ce sujet. Quelqu'un peut-il éclairer les différences entre ces deux?Quelle est la différence entre les annotations @After et @Final pour les contrôleurs Play

@After - Les méthodes annotées avec l'annotation @After sont exécutées après chaque appel d'action pour ce contrôleur.

@Finally - Les méthodes annotées avec l'annotation @Final sont exécutées après l'application de chaque résultat d'action pour ce contrôleur.

Est-ce que cela nuirait aux performances à utiliser @Finalement quand @After fonctionnerait?

+0

Votre comportement peut différer ... @ Enfin, les méthodes sont appelées plus tard que les méthodes @After, ce qui peut affecter le comportement des méthodes. –

Répondre

12

Si vous écrivez un petit harnais de test, vous verrez comment cela fonctionne, mais le point crucial de c'est ce

  • @Before est appelée avant l'action est exécutée

  • @After est appelé après que votre contrôleur a terminé son exécution, mais avant que la sortie ne soit rendue au navigateur

  • @Finalement appelé lorsque les résultats ont été affichés dans le navigateur.

Ainsi, dans la plupart des cas, @After et @finally travaillera pour vous de la même manière, mais n'ont une légère différence, en fonction de votre cas d'utilisation particulière. Cela ne devrait cependant pas faire de différence.

Le harnais de test que j'ai écrit pour le prouver, est la suivante

public class Application extends Controller { 

    @Before 
    static void log0() {Logger.info("before: "+ response.out.size());} 
    @After 
    static void log1() {Logger.info("After: "+ response.out.size());} 
    @Finally 
    static void log2() {Logger.info("finally: "+ response.out.size());} 

    public static void index() { 
     Logger.info("in index action"); 
     render(); 
    } 
} 

La sortie que je reçois est comme suit

20:51:37,741 INFO ~ before: 0 
20:51:37,742 INFO ~ in index action 
20:51:38,083 INFO ~ After: 0 
20:51:38,106 INFO ~ finally: 706 

Ce qui montre clairement l'ordre de traitement, et les données envoyé à l'objet HTTP Response.