本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接
Debug 笔记 <ServletContextListener执行顺序>
提问
如果我有多个ServletContextListener,并且其中一些是在部署描述符中声明的,而另一些带有批注(@WebListener),则如何定义应用程序初始化后ServletContextListener的执行顺序?
回答一
如果要按特定顺序执行侦听器,则应使用部署描述符来定义它们。
以下语句是从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片段中指定的配置优先于通过注释指定的配置。
回答二
似乎您知道执行的顺序,但是您想知道如果在部署描述符中声明了某些侦听器,而在使用批注的情况下声明了某些侦听器,那么优先级将由部署描述符然后进行批注。
请注意,将首先按部署描述符和注释的顺序调用所有侦听器的构造函数,然后按相同顺序调用生命周期方法。
文章翻译自Stack Overflow :stackoverflow.com/questions/1…