Play控制器的@After和@Finally注释之间有什么区别?

时间:2010-11-03 19:45:29

标签: java annotations controller playframework

文档对此不太清楚。有人可以阐明这两者之间的差异吗?

@After - 在每次调用此Controller后,都会执行使用@After注释注释的方法。

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

当@After工作时,使用@Finally会不会影响性能?

1 个答案:

答案 0 :(得分: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

清楚地显示了处理顺序,以及输出到HTTP Response对象的数据。