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片段中指定的配置优先于通过注释指定的配置。
您似乎知道执行的顺序,但是您想知道如果在部署描述符中声明了一些侦听器,并且某些侦听器使用注释,那么它将是什么,因此首选项由部署描述符和注释进行。
请注意,将按部署描述符然后注释的顺序首先调用所有侦听器的构造函数,然后按相同的顺序调用生命周期方法。