Was ist der Unterschied zwischen @After und @Finally Anmerkungen für Play-Controller
-
28-09-2019 - |
Frage
Die Dokumentation ist nicht sehr klar zu diesem Thema. Kann jemand die Unterschiede zwischen diesen beiden beleuchten?
@After
-. Methoden mit der @After Anmerkung kommentierten werden für diesen Regler nach jeder Aktion Aufruf ausgeführt
@Finally
-. Methoden mit der @Finally Anmerkung kommentieren ausgeführt werden, nach jeder Aktion resultiert aus für diesen Controller angewandt wird,
Würde es weh Leistung @Finally zu verwenden, wenn @After funktionieren würde?
Lösung
Wenn Sie einen kleinen Test-Harnisch schreiben, werden Sie sehen, wie das funktioniert, aber der Kernpunkt ist das
-
@Before aufgerufen wird, bevor Sie Aktion ausgeführt wird
-
@After wird aufgerufen, nachdem der Controller seine Ausführung abgeschlossen ist, aber bevor die Ausgabe an den Browser gerendert wird
-
@Finally aufgerufen wird, wenn die Ergebnisse an den Browser veröffentlicht.
So in den meisten Fällen @After und @Finally werden auf die gleiche Art und Weise für Sie arbeiten, aber einen geringen Unterschied, je nach Ihrem speziellen Anwendungsfall. Es sollte jedoch keinen Unterschied, um die Leistung machen.
Der Test-Harnisch, dass ich schrieb, dies zu beweisen, folgt als
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();
}
}
Der Ausgang I get wird folgt als
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
Welche deutlich die Reihenfolge der Verarbeitung zeigt, und die Daten an den HTTP-Response-Objekt ausgegeben wird.