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 默认的ServletContextInitializerInitParameterConfiguringServletContextInitializer(从外部配置文件读取前缀为server的配置,然后用来初始化ServletContext,比如server.portServerProperties.SessionConfiguringInitializer(用来配置cookie等内容),ServerPropertiesAutoConfiguration会自动配置一个ServerProperties ServerProperties中包含了这两个ServletContextInitializer来默认初始化ServletContext

Scanning for Servlets, Filters, and listeners

当使用一个内嵌容器时,通过@ServletComponentScan可以启用对注解@WebServlet@WebFilter@WebListener类的自动注册。

在独立的容器(非内嵌)中@ServletComponentScan不起作用,取为代之的是容器内建的discovery机制。

results matching ""

    No results matching ""