В чем разница между аннотациями @After и @finally для игровых контроллеров
-
28-09-2019 - |
Вопрос
Документация не очень поняла на этом. Может кто-нибудь освещать различия между этими двумя?
@After
- методы, аннотированные с аннотацией @After, выполняются после каждого вызова действия этого контроллера.
@Finally
- методы, аннотируемые с аннотацией @finally, выполняются после того, как каждый результат действий применяется из этого контроллера.
Это повредит производительностью для использования @finally, когда @After будет работать?
Решение
Если вы пишете небольшой тестовый жгут, вы увидите, как это работает, но суть именно это
@BEFORE вызывается до выполнения действий
@After вызывается после завершения вашего контроллера, но до того, как вывод будет отображаться в браузере
@Finally называется, когда результаты были размещены в браузере.
Таким образом, в большинстве случаев @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.