微服务架构之Spring Boot(三十八)

2022-04-07 20:01:49 浏览数 (1)

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。如果您需要做一些更具异国情调的事情,还会提供一些受保护的方法“挂钩”。有关详细信息,请参阅 源代码文

档。

0 人点赞