ServletContextListener执行顺序

Tim*_*dze 37 java servlets servletcontextlistener

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

Deb*_*kia 70

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

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

8.2.3:

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

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

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

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

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

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

  • 规格引用为+1. (11认同)

Mr *_*ark 7

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

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