ServletContextListener执行顺序

如何在应用程序初始化时定义ServletContextListener执行的顺序,如果我有多个ServletContextListener,并且其中一些在部署描述符中声明,另一些在注释(@WebListener)中声明?

如果要以特定顺序执行侦听器,则应使用部署描述符来定义它们。

以下语句是从Servlet规范中复制的:

8.2.3

如果调用侦听器,servlet,filter的顺序对应用程序很重要,则必须使用部署描述符。 使用注释定义侦听器,servlet和filter时,未指定调用它们的顺序。

排序将基于它们在描述符中定义的顺序以及web.xml的绝对排序元素或web-fragment.xml的排序元素。

在此版本发布之前(Java™Servlet规范,版本3),以随机顺序调用上下文侦听器。 从Servlet 3.0开始,将按照在web.xml中声明它们的顺序调用侦听器。

javax.servlet.ServletContextListener实现在其contextInitialized方法中按其声明的顺序调用,并在其contextDestroyed方法中以相反的顺序contextDestroyed

如果您有多个ServletContextListener,其中一些在部署描述符中声明,而另一些在注释中声明,则其在web.xml中定义的侦听器将获得优先级。 下面的语句是从servlet规范的相同部分(8.2.3)复制的:

主web.xml或Web片段中指定的配置优先于通过注释指定的配置。

您似乎知道执行的顺序,但是您想知道如果在部署描述符中声明了一些侦听器,并且某些侦听器使用注释,那么它将是什么,因此首选项由部署描述符和注释进行。

请注意,将按部署描述符然后注释的顺序首先调用所有侦听器的构造函数,然后按相同的顺序调用生命周期方法。