28.4.2 Servlet上下文初始化
嵌入式servlet容器不直接执行Servlet 3.0 javax.servlet.ServletContainerInitializer 接口或Spring
的 org.springframework.web.WebApplicationInitializer 接口。这是一项有意的设计决策,旨在降低设计在战争中运行的第三方图书馆
可能会破坏Spring Boot应用程序的风险。
如果需要在Spring Boot应用程序中执行servlet上下文初始化,则应注册实
现 org.springframework.boot.web.servlet.ServletContextInitializer 接口的bean。单 onStartup 方法提供对 ServletContext 的
访问,如果需要,可以很容易地用作现有 WebApplicationInitializer 的适配器。
扫描Servlet,过滤器和侦听器
使用嵌入式容器时,可以使用 @ServletComponentScan 启用使用 @WebServlet , @WebFilter 和 @WebListener 注释的类的自动注册。
@ServletComponentScan 对独立容器没有影响,其中使用容器的内置发现机制。
28.4.3 ServletWebServerApplicationContext
在引擎盖下,Spring Boot使用不同类型的 ApplicationContext 来支持嵌入式servlet容器。ServletWebServerApplicationContext
是 WebApplicationContext 的一种特殊类型,它通过搜索单个 ServletWebServerFactory bean来引导自己。通常会自动配
置 TomcatServletWebServerFactory , JettyServletWebServerFactory 或 UndertowServletWebServerFactory 。
您通常不需要了解这些实现类。大多数应用程序都是自动配置的,并且代表您创建了相应的 ApplicationContext
和 ServletWebServerFactory 。
28.4.4自定义嵌入式Servlet容器
可以使用Spring Environment 属性配置公共servlet容器设置。通常,您将在 application.properties 文件中定义属性。
常用服务器设置包括:
网络设置:侦听传入HTTP请求的端口( server.port ),绑定到 server.address 的接口地址,依此类推。
会话设置:会话是持久的( server.servlet.session.persistence ),会话超时( server.servlet.session.timeout ),会话数据
的位置( server.servlet.session.store-dir )和会话cookie配置( server.servlet.session.cookie.* )。
错误管理:错误页面的位置( server.error.path )等。
SSL
HTTP压缩
Spring Boot尝试尽可能多地暴露常见设置,但这并非总是可行。对于这些情况,专用命名空间提供特定于服务器的自定义(请参
阅 server.tomcat 和 server.undertow )。例如, 可以使用嵌入式servlet容器的特定功能配置访问日志。
请参阅 ServerProperties 课程以获取完整列表。
程序化定制
如果需要以编程方式配置嵌入式servlet容器,可以注册实现 WebServerFactoryCustomizer 接口的Spring
bean。WebServerFactoryCustomizer 提供对 ConfigurableServletWebServerFactory 的访问,其中包括许多自定义setter方法。以下示
例以编程方式设置端口:
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.stereotype.Component;
@Component
public class CustomizationBean implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
@Override
public void customize(ConfigurableServletWebServerFactory server) {
server.setPort(9000);
}
}
TomcatServletWebServerFactory , JettyServletWebServerFactory 和 UndertowServletWebServerFactory 是 ConfigurableSer
专用变体,分别为Tomcat,Jetty和Undertow提供了额外的自定义setter方法。
直接自定义ConfigurableServletWebServerFactory
如果前面的自定义技术太有限,您可以自己注册 TomcatServletWebServerFactory , JettyServletWebServerFactory
或 UndertowServletWebServerFactory bean。
@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.setPort(9000);
factory.setSessionTimeout(10, TimeUnit.MINUTES);
factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/notfound.html"));
return factory;
}
为许多配置选项提供了Setter。如果您需要做一些更具异国情调的事情,还会提供一些受保护的方法“挂钩”。有关详细信息,请参阅 源代码文
档。