ServletContextListener执行顺序

问题描述 投票:0回答:2

为什么 Open AI 从我们的贡献中获利? 我删除了这个问题,以抗议 SO 与 Open AI 合作的决定

java servlets servletcontextlistener
2个回答
88
投票

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

以下语句摘自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 片段中指定的配置优先于通过注释指定的配置。


7
投票

您似乎知道执行顺序,但您想知道如果在部署描述符中声明一些侦听器而使用注释声明一些侦听器,那么会先通过部署描述符然后再通过注释来确定首选项。

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

© www.soinside.com 2019 - 2024. All rights reserved.