47

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

4

2 回答 2

83

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

以下语句是从Servlet Specification复制的:

8.2.3

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

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

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

的实现在它们的方法中按照它们被声明的顺序javax.servlet.ServletContextListener被调用,并且在它们的方法中以相反的顺序被调用。contextInitializedcontextDestroyed

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

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

于 2013-11-01T15:15:45.153 回答
7

似乎您知道执行顺序,但您想知道如果在部署描述符中声明了一些侦听器而使用注释声明了一些侦听器,那么部署描述符和注释将优先选择。

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

于 2013-11-01T15:35:46.083 回答