プレイコントローラーの@afterと@finallyアノテーションの違いは何ですか
-
28-09-2019 - |
質問
これについてはドキュメントはあまり明確ではありません。誰かがこれら2つの違いを照らすことができますか?
@After
- @Afterアノテーションで注釈された方法は、このコントローラーを求める各アクションコールの後に実行されます。
@Finally
- @Finally Annotationで注釈が付けられた方法は、このコントローラーに各アクション結果が適用された後に実行されます。
@afterが機能するときに@finallyを使用することはパフォーマンスを傷つけますか?
解決
小さなテストハーネスを書くと、これがどのように機能するかがわかりますが、それの核心はこれです
@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応答オブジェクトに出力されるデータを明確に示しています。
所属していません StackOverflow