Quelle est la différence entre les annotations et @After @finally pour les contrôleurs de jeu
-
28-09-2019 - |
Question
La documentation est pas très claire sur ce point. Quelqu'un peut-il éclairer les différences entre ces deux?
@After
-. Méthodes annotés avec l'annotation @After sont exécutées après chaque appel d'action pour ce contrôleur
@Finally
-. Méthodes annotés avec l'annotation @finally sont exécutées après chaque résultat de l'action est appliquée à partir de ce contrôleur
Ne serait-il nui au rendement à utiliser @finally quand @After fonctionnerait?
La solution
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 action est exécutée
-
@After est appelée après que le contrôleur a terminé son exécution, mais avant que la sortie est rendu au navigateur
-
@finally est appelée lorsque les résultats ont été affichés dans le navigateur.
Ainsi, dans la plupart des cas, travaillera pour vous @After et @finally de la même manière, mais n'ont une légère différence, en fonction de votre cas d'utilisation particulière. Il ne doit pas cependant faire une différence à la performance.
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 I get est la suivante
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 en sortie au l'objet de réponse HTTP.