如果我有多个ServletContextListener,其中一些在部署描述符中声明,另一些带有注释(@WebListener),如何定义ServletContextListener在应用程序初始化时的执行顺序?
发布于 2013-11-01 23:15:45
如果您希望以特定的顺序执行侦听器,则应该使用部署描述符来定义它们。
下面的语句是从Servlet Specification复制的
8.2.3:
如果调用侦听器、servlet、过滤器的顺序对应用程序很重要,则必须使用部署描述符。当使用注释来定义侦听器、servlet和过滤器时,它们的调用顺序是未指定的。
排序将基于它们在描述符中定义的顺序以及web.xml中的绝对排序元素或web-fragment.xml中的排序元素。
在此规范(Java规范,版本3)发布之前,上下文侦听器是以随机顺序调用的。从Servlet3.0开始,监听器是按照它们在web.xml中声明的顺序调用的。
javax.servlet.ServletContextListener的实现在它们的contextInitialized方法中以声明的顺序调用,在它们的contextDestroyed方法中以相反的顺序调用。
如果您有多个ServletContextListeners,其中一些是在部署描述符中声明的,另一些是使用注释声明的,那么在web.xml中定义的侦听器将获得优先级。下面的语句复制自servlet规范的同一节(8.2.3):
在主web.xml或web片段中指定的
配置优先于通过注释指定的配置。
发布于 2013-11-01 23:35:46
看起来您知道执行的顺序,但是您想知道如果一些侦听器在部署描述符中声明,而另一些侦听器使用注释声明,那么执行的顺序是什么,因此优先选择部署描述符,然后使用注释。
注意,所有侦听器的构造函数将首先按照部署描述符的顺序调用&然后是注释,最后是生命周期方法。
https://stackoverflow.com/questions/19729370
复制相似问题