代码之家  ›  专栏  ›  技术社区  ›  Brad Mace Mike King

播放控制器的@After和@Finally注释有什么区别

  •  4
  • Brad Mace Mike King  · 技术社区  · 14 年前

    文档对此不是很清楚。有人能说明这两者的区别吗?

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

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

    使用“最终何时”和“之后”会影响性能吗?

    1 回复  |  直到 14 年前
        1
  •  12
  •   Codemwnci    14 年前

    如果您编写一个小的测试工具,您将看到它是如何工作的,但关键是

    • @在执行操作之前调用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响应对象的数据。