Qual è la differenza tra @After e @Finally annotazioni per i controller Giochi
-
28-09-2019 - |
Domanda
La documentazione non è molto chiaro su questo. Qualcuno può illuminare le differenze tra questi due?
@After
-. Metodi annotati con l'annotazione @After vengono eseguite dopo ogni chiamata all'azione per questo controller
@Finally
-. Metodi annotati con l'annotazione @Finally vengono eseguite dopo ogni risultato azione viene applicata da questo controller
sarebbe male prestazioni da utilizzare quando @Finally @After avrebbe funzionato?
Soluzione
Se si scrive un piccolo test harness, potrete vedere come funziona, ma il punto cruciale è questo
-
@Before viene chiamato prima viene eseguita l'azione
-
@After viene chiamato dopo il controller ha completato la sua esecuzione, ma prima che l'uscita è reso al browser
-
@Finally viene chiamato quando i risultati sono stati pubblicati al browser.
Quindi, nella maggior parte dei casi, @After e @Finally lavorerà per voi allo stesso modo, ma hanno una leggera differenza, a seconda del particolare caso d'uso. Non dovrebbe fare alcuna differenza per le prestazioni però.
Il coordinatore di prova che ho scritto per dimostrare questo, è il seguente
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();
}
}
L'I get uscita è la seguente
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
che mostra chiaramente l'ordine di elaborazione, e i dati che vengono emessi al l'oggetto Response HTTP.