Как определить порядок выполнения ServletContextListener за счет запуска приложения, если у меня есть несколько ServletContextListener, а некоторые из них объявлены в дескрипторе развертывания и другие с аннотацией (@WebListener)?
Порядок выполнения ServletContextListener
Ответ 1
Если вы хотите выполнить прослушиватели в определенном порядке, вы должны использовать дескриптор развертывания для их определения.
Ниже операторы скопированы из Спецификация сервлета:
8.2.3:
Если порядок, в котором вызывается прослушиватели, сервлеты, фильтры, является важным для приложения, тогда должен использоваться дескриптор развертывания. При использовании аннотаций для определения слушателей, сервлетов и фильтров порядок, в котором они вызывается, не указан.
Порядок будет основан на порядке, в котором они определены в дескрипторе и элементе абсолютного упорядочения в
web.xml
или в элементе упорядочения вweb-fragment.xml
.До этого выпуска спецификации (Java ™ Servlet Спецификация, версия 3), прослушиватели контекста вызывались случайным образом заказ. Начиная с Servlet 3.0, слушатели вызывают в порядке, указанном в которые они объявлены в web.xml.
Реализации
javax.servlet.ServletContextListener
вызываются по методуcontextInitialized
в том порядке, в котором они были объявлены, и по методуcontextDestroyed
в обратном порядке.
Если у вас есть несколько ServletContextListeners, и некоторые из них объявлены в дескрипторе развертывания, а другие - аннотацией, то его слушатели, определенные в web.xml
, получат приоритет. Ниже оператор копируется из того же раздела (8.2.3) спецификации сервлета:
Конфигурация, указанная в главном web.xml или веб-фрагменте, имеет приоритет над конфигурацией, указанной аннотациями.
Ответ 2
Кажется, вы знаете порядок исполнения, но вы хотите знать, что будет, если некоторые слушатели объявлены в дескрипторе развертывания, а некоторые - аннотацией, поэтому предпочтение отдается дескриптору развертывания, а затем аннотации.
Обратите внимание, что конструкторы всех слушателей будут вызываться сначала по порядку дескриптора развертывания, а затем по аннотации, а затем по жизненным циклам в том же порядке.