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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top