4

文档对此不是很清楚。有人可以阐明这两者之间的区别吗?

@After- 使用 @After 注释注释的方法在此控制器的每个操作调用后执行。

@Finally- 使用@Finally 注释注释的方法在为此控制器应用每个操作结果后执行。

当@After 起作用时使用@Finally 会损害性能吗?

4

1 回答 1

12

如果你写一个小测试工具,你会看到它是如何工作的,但关键是这个

  • @Before 在您执行操作之前调用

  • @After 在你的控制器完成执行之后调用,但在输出呈现给浏览器之前

  • 当结果发布到浏览器时调用@Final。

所以在大多数情况下,@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 响应对象的数据。

于 2010-11-03T20:48:02.363 回答