How to define order of ServletContextListener's execution due application initialization, if i have multiple ServletContextListener's and some of them declared in deployment descriptor and other with annotation (@WebListener)?
If you want to execute listeners in a particular order, you should use deployment descriptor to define them.
Below statements are copied from Servlet Specification:
8.2.3:
If the order in which the listeners, servlets, filters are invoked is important to an application then a deployment descriptor must be used. When using annotations to define the listeners, servlets and filters, the order in which they are invoked is unspecified.
The ordering will be based on the order in which they are defined in the descriptor and on the absolute-ordering element in the
web.xml
or an ordering element in theweb-fragment.xml
.Prior to this release of the specification (Java™ Servlet Specification, version 3), context listeners were invoked in random order. As of Servlet 3.0, the listeners are invoked in the order in which they are declared in the web.xml.
Implementations of
javax.servlet.ServletContextListener
are invoked at theircontextInitialized
method in the order in which they have been declared, and at theircontextDestroyed
method in reverse order.
If you have multiple ServletContextListeners and some of them are declared in deployment descriptor and others with annotation, then its the listeners defined in web.xml
that will get the precedence. Below statement is copied from the same section (8.2.3) of servlet specification:
Configuration specified in the main web.xml or a web fragment takes precedence over the configuration specified via annotations.