該類的API文檔:http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContainerInitializer.htmlhtml
Servlet 3.0 規範,能夠經過實現ServletContainerInitializer接口,在容器啓動階段,爲容器動態註冊Servlet、Filter 以及listeners。實現該接口的類必須在JAR文件的META-INF/services/javax.servlet.ServletContainerInitializer文件中,聲明全類名。java
在Spring-web.jar中,有以下目錄:web
$ find . . ./META-INF ./META-INF/services ./META-INF/services/javax.servlet.ServletContainerInitializer ./org
查看內容以下:spring
$ cat ./META-INF/services/javax.servlet.ServletContainerInitializer org.springframework.web.SpringServletContainerInitializer
能夠看到,Spring Web經過SpringServletContainerInitializer進行spring servlet初始化。對於SpringServletContainerInitializer,Spring API文檔說明以下:api
Servlet 3.0
ServletContainerInitializer
designed to support code-based configuration of the servlet container using Spring'sWebApplicationInitializer
SPI as opposed to (or possibly in combination with) the traditionalweb.xml
-based approach.bashMechanism of Operation
This class will be loaded and instantiated and have itsonStartup
method invoked by any Servlet 3.0-compliant container during container startup assuming that thespring-web
module JAR is present on the classpath. This occurs through the JAR Services APIServiceLoader.load(Class)
method detecting thespring-web
module'sMETA-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.when in combination with
web.xml
If a web application does include a
WEB-INF/web.xml
file, it is important to understand that neither this nor any otherServletContextInitializer
will be processed unless the<web-app>
element'sversion
attribute is >= "3.0" and thexsi:schemaLocation
for "http://java.sun.com/xml/ns/javaee" is set to "http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd".oracleRelationship to Spring's
Spring'sWebApplicationInitializer
WebApplicationInitializer
SPI consists of just one method:WebApplicationInitializer.onStartup(ServletContext)
. The signature is intentionally quite similar toServletContainerInitializer.onStartup(Set, ServletContext)
: simply put,SpringServletContainerInitializer
is responsible for instantiating and delegating theServletContext
to any user-definedWebApplicationInitializer
implementations. It is then the responsibility of eachWebApplicationInitializer
to do the actual work of initializing theServletContext
. The exact process of delegation is described in detail in theonStartup
documentation below.General Notes
In general, this class should be viewed as supporting infrastructure for the more important and user-facingWebApplicationInitializer
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 anyWebApplicationInitializer
implementations available on the classpath. If noWebApplicationInitializer
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 thespring-web
module JAR. Rather, they can be considered general-purpose in their ability to facilitate convenient code-based configuration of theServletContext
. Said another way, any servlet, listener, or filter may be registered within aWebApplicationInitializer
, not just Spring MVC-specific components.appThis class is not designed for nor intended to be extended. It should be considered an internal type, with
WebApplicationInitializer
being the public-facing SPI.lessSee Also
See
WebApplicationInitializer
Javadoc for examples and detailed usage recommendations.ide
AbstractDispatcherServletInitializer類實現了WebApplicationInitializer接口,用於註冊DispatcherServlet類。