В чем разница между аннотациями @After и @Finally для контроллеров Play - PullRequest
4 голосов
/ 03 ноября 2010

Документация не очень ясна по этому вопросу. Может кто-нибудь осветить различия между этими двумя?

@After - Методы, помеченные аннотацией @After, выполняются после каждого вызова действия для этого контроллера.

@Finally - Методы, помеченные аннотацией @Finally, выполняются после применения каждого результата действия для этого контроллера.

Не повредит ли производительность использованию @Finally, когда @After будет работать?

1 Ответ

12 голосов
/ 03 ноября 2010

Если вы напишете небольшой тестовый жгут, вы увидите, как это работает, но суть его такова

  • @ До вызова до того, как вы выполните действие

  • @ After вызывается после того, как контроллер завершил свое выполнение, но до того, как вывод будет отображен в браузере

  • @ Наконец, вызывается, когда результаты былиотправлено в браузер.

Так что в большинстве случаев @After и @Finally будут работать для вас одинаково, но с небольшой разницей, в зависимости от вашего конкретного варианта использования,Однако это не должно иметь никакого значения для производительности.

Испытательный комплект, который я написал, чтобы доказать это, выглядит следующим образом

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

Вывод, который я получаю, выглядит следующим образом

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

, который четко показывает порядок обработки и данные, выводимые в объект HTTP-ответа.

...