public class SpringServletContainerInitializer extends Object implements ServletContainerInitializer
ServletContainerInitializer
designed to support code-based
configuration of the servlet container using Spring's WebApplicationInitializer
SPI as opposed to (or possibly in combination with) the traditional
web.xml
-based approach.
onStartup(java.util.Set<java.lang.Class<?>>, javax.servlet.ServletContext)
method invoked by any Servlet 3.0-compliant container during container startup assuming
that the spring-web
module JAR is present on the classpath. This occurs through
the JAR Services API ServiceLoader.load(Class)
method detecting the
spring-web
module's META-INF/services/javax.servlet.ServletContainerInitializer
service provider configuration file. See the
JAR Services API documentation as well as section 8.2.4 of the Servlet 3.0
Final Draft specification for complete details.
web.xml
If a web application includes a WEB-INF/web.xml
file, it is important to
understand that neither this nor any other ServletContextInitializer
will be
processed unless the <web-app>
element's version
attribute is >= "3.0"
and the xsi:schemaLocation
for "http://java.sun.com/xml/ns/javaee" is set to
"http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd".
A web application can choose to limit the amount of classpath scanning the Servlet
container does at startup either through the metadata-complete
attribute in
web.xml
, which controls scanning for Servlet annotations or through an
<absolute-ordering>
element also in web.xml
, which controls which
web fragments (i.e. jars) are allowed to perform a ServletContainerInitializer
scan. When using this feature, the SpringServletContainerInitializer
can be enabled by adding "spring_web" to the list of named web fragments in
web.xml
as follows:
<absolute-ordering>
<name>some_web_fragment</name>
<name>spring_web</name>
</absolute-ordering>
WebApplicationInitializer
WebApplicationInitializer
SPI consists of just one method:
WebApplicationInitializer.onStartup(ServletContext)
. The signature is intentionally
quite similar to ServletContainerInitializer.onStartup(Set, ServletContext)
:
simply put, SpringServletContainerInitializer
is responsible for instantiating
and delegating the ServletContext
to any user-defined
WebApplicationInitializer
implementations. It is then the responsibility of
each WebApplicationInitializer
to do the actual work of initializing the
ServletContext
. The exact process of delegation is described in detail in the
onStartup
documentation below.
WebApplicationInitializer
SPI. Taking
advantage of this container initializer is also completely optional: while
it is true that this initializer will be loaded and invoked under all Servlet 3.0+
runtimes, it remains the user's choice whether to make any
WebApplicationInitializer
implementations available on the classpath. If no
WebApplicationInitializer
types are detected, this container initializer will
have no effect.
Note that use of this container initializer and of WebApplicationInitializer
is not in any way "tied" to Spring MVC other than the fact that the types are shipped
in the spring-web
module JAR. Rather, they can be considered general-purpose
in their ability to facilitate convenient code-based configuration of the
ServletContext
. In other words, any servlet, listener, or filter may be
registered within a WebApplicationInitializer
, not just Spring MVC-specific
components.
This class is neither designed for extension nor intended to be extended.
It should be considered an internal type, with WebApplicationInitializer
being the public-facing SPI.
WebApplicationInitializer
Javadoc for examples and detailed usage
recommendations.onStartup(Set, ServletContext)
,
WebApplicationInitializer
Constructor and Description |
---|
SpringServletContainerInitializer() |
Modifier and Type | Method and Description |
---|---|
void |
onStartup(Set<Class<?>> webAppInitializerClasses,
ServletContext servletContext)
Delegate the
ServletContext to any WebApplicationInitializer
implementations present on the application classpath. |
public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException
ServletContext
to any WebApplicationInitializer
implementations present on the application classpath.
Because this class declares @HandlesTypes(WebApplicationInitializer.class)
,
Servlet 3.0+ containers will automatically scan the classpath for implementations
of Spring's WebApplicationInitializer
interface and provide the set of all
such types to the webAppInitializerClasses
parameter of this method.
If no WebApplicationInitializer
implementations are found on the
classpath, this method is effectively a no-op. An INFO-level log message will be
issued notifying the user that the ServletContainerInitializer
has indeed
been invoked but that no WebApplicationInitializer
implementations were
found.
Assuming that one or more WebApplicationInitializer
types are detected,
they will be instantiated (and sorted if the @@Order
annotation is present or
the Ordered
interface has been
implemented). Then the WebApplicationInitializer.onStartup(ServletContext)
method will be invoked on each instance, delegating the ServletContext
such
that each instance may register and configure servlets such as Spring's
DispatcherServlet
, listeners such as Spring's ContextLoaderListener
,
or any other Servlet API componentry such as filters.
onStartup
in interface ServletContainerInitializer
webAppInitializerClasses
- all implementations of
WebApplicationInitializer
found on the application classpathservletContext
- the servlet context to be initializedServletException
WebApplicationInitializer.onStartup(ServletContext)
,
AnnotationAwareOrderComparator