27.3.2 Servlet Context Initialization
内嵌servlet容器不会直接执行Servlet 3.0+的javax.servlet.ServletContainerInitializer接口,或Spring的org.springframework.web.WebApplicationInitializer接口,这样设计的目的是降低war包内运行的第三方库破坏Spring Boot应用的风险。
Spring Boot会更具当前classpath环境,如果发现是web环境,则启动一个EmbeddedWebApplicationContext的Spring 上下文,有它启动EmbeddedServletContainer,如果是classpath里是Tomncat则使用
TomcatEmbeddedServletContainer并使用实现了ServletContextInitializer的类,完成对ServletContext的配置
如果需要在Spring Boot应用中执行ServletContext初始化,你需要注册一个实现org.springframework.boot.web.servlet.ServletContextInitializer接口的bean。onStartup方法可以获取ServletContext,
Spring Boot 默认的
ServletContextInitializer有InitParameterConfiguringServletContextInitializer(从外部配置文件读取前缀为server的配置,然后用来初始化ServletContext,比如server.port)ServerProperties.SessionConfiguringInitializer(用来配置cookie等内容),ServerPropertiesAutoConfiguration会自动配置一个ServerPropertiesServerProperties中包含了这两个ServletContextInitializer来默认初始化ServletContext
Scanning for Servlets, Filters, and listeners
当使用一个内嵌容器时,通过@ServletComponentScan可以启用对注解@WebServlet,@WebFilter和@WebListener类的自动注册。
在独立的容器(非内嵌)中
@ServletComponentScan不起作用,取为代之的是容器内建的discovery机制。