4

ドキュメントはこれについてあまり明確ではありません。誰かがこれら2つの違いを明らかにできますか?

@After- @After アノテーションが付けられたメソッドは、このコントローラーの各アクション呼び出しの後に実行されます。

@Finally- @Finally アノテーションが付けられたメソッドは、各アクションの結果がこのコントローラーに適用された後に実行されます。

@After が機能するときに @Finally を使用すると、パフォーマンスが低下しますか?

4

1 に答える 1

12

小さなテストハーネスを書くと、これがどのように機能するかがわかりますが、その核心はこれです

  • @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

これは、処理の順序と、HTTPResponseオブジェクトに出力されるデータを明確に示しています。

于 2010-11-03T20:48:02.363 に答える