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
会自动配置一个ServerProperties
ServerProperties
中包含了这两个ServletContextInitializer
来默认初始化ServletContext
Scanning for Servlets, Filters, and listeners
当使用一个内嵌容器时,通过@ServletComponentScan
可以启用对注解@WebServlet
,@WebFilter
和@WebListener
类的自动注册。
在独立的容器(非内嵌)中
@ServletComponentScan
不起作用,取为代之的是容器内建的discovery机制。