如果我有多个ServletContextListener并且其中一些是在部署描述符中声明的,而另一些是使用注释(@WebListener),那么如何定义ServletContextListener执行应用程序初始化的顺序?
答案 0 :(得分:67)
如果要按特定顺序执行侦听器,则应使用部署描述符来定义它们。
以下语句是从Servlet Specification复制的:
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 :(得分:6)
您似乎知道执行的顺序,但是您想知道如果在部署描述符中声明了一些侦听器并且某些侦听器使用注释,那么它将是什么,因此首选项由部署描述符和注释进行。
注意所有侦听器的构造函数将按部署描述符&的顺序首先调用。然后注释,然后生命周期方法以相同的顺序。