Java 什么';播放控制器的@After和@Finally注释之间的区别是什么

Java 什么';播放控制器的@After和@Finally注释之间的区别是什么,java,annotations,controller,playframework,Java,Annotations,Controller,Playframework,关于这方面的文档不是很清楚。有人能解释一下这两者之间的区别吗 @After-在该控制器的每个操作调用之后执行带有@After注释的方法 @Finally-在为该控制器应用每个操作结果后,将执行带有@Finally注释的方法 当@After起作用时使用@Finally会影响性能吗?如果您编写一个小测试工具,您将看到它是如何工作的,但它的关键是 @在执行操作之前调用Before @在控制器完成其执行后,但在输出呈现到浏览器之前调用After @将结果发布到浏览器时调用Finally 因此,在大多

关于这方面的文档不是很清楚。有人能解释一下这两者之间的区别吗

@After
-在该控制器的每个操作调用之后执行带有@After注释的方法

@Finally
-在为该控制器应用每个操作结果后,将执行带有@Finally注释的方法


当@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
我得到的结果如下

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响应对象的数据。

您的行为可能会有所不同…@Finally方法比@After方法调用得晚,这可能会影响方法的行为。