| 此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Boot 3.5.5! | 
嵌入式 Web 服务器
每个 Spring Boot Web 应用程序都包含一个嵌入式 Web 服务器。 此功能会导致许多作方法问题,包括如何更改嵌入式服务器以及如何配置嵌入式服务器。 本节回答这些问题。
使用其他 Web 服务器
许多 Spring Boot Starters都包含默认的嵌入式容器。
- 
对于 servlet 堆栈应用程序, spring-boot-starter-web通过包含 Tomcatspring-boot-starter-tomcat,但您可以使用spring-boot-starter-jetty或spring-boot-starter-undertow相反。
- 
对于响应式堆栈应用程序, spring-boot-starter-webflux通过包含 Reactor Nettyspring-boot-starter-reactor-netty,但您可以使用spring-boot-starter-tomcat,spring-boot-starter-jetty或spring-boot-starter-undertow相反。
切换到不同的 HTTP 服务器时,您需要将默认依赖项交换为所需的依赖项。 为了帮助完成此过程,Spring Boot 为每个受支持的 HTTP 服务器提供了一个单独的Starters。
以下 Maven 示例显示了如何为 Spring MVC 排除 Tomcat 并包含 Jetty:
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<exclusions>
		<!-- Exclude the Tomcat dependency -->
		<exclusion>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<!-- Use Jetty instead -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>以下 Gradle 示例配置了必要的依赖项和模块替换,以使用 Undertow 代替 Spring WebFlux 的 Reactor Netty:
dependencies {
	implementation "org.springframework.boot:spring-boot-starter-undertow"
	implementation "org.springframework.boot:spring-boot-starter-webflux"
	modules {
		module("org.springframework.boot:spring-boot-starter-reactor-netty") {
			replacedBy("org.springframework.boot:spring-boot-starter-undertow", "Use Undertow instead of Reactor Netty")
		}
	}
}| spring-boot-starter-reactor-netty需要使用WebClient类,因此即使您需要包含不同的 HTTP 服务器,您也可能需要保持对 Netty 的依赖。 | 
禁用 Web 服务器
如果您的类路径包含启动 Web 服务器所需的位,Spring Boot 将自动启动它。
要禁用此行为,请配置WebApplicationType在你的application.properties,如以下示例所示:
- 
Properties 
- 
YAML 
spring.main.web-application-type=nonespring:
  main:
    web-application-type: "none"更改 HTTP 端口
在独立应用程序中,主 HTTP 端口默认为8080但可以使用server.port(例如,在application.properties或作为系统属性)。
得益于宽松的绑定Environment值,也可以使用SERVER_PORT(例如,作为作系统环境变量)。
要完全关闭 HTTP 端点,但仍创建WebApplicationContext用server.port=-1(这样做有时对测试很有用)。
有关更多详细信息,请参阅“Spring Boot 功能”部分中的自定义嵌入式 Servlet 容器,或ServerProperties类。
在运行时发现 HTTP 端口
您可以从日志输出或WebServerApplicationContext通过其WebServer.
获取它并确保它已初始化的最佳方法是添加一个@Bean类型ApplicationListener<WebServerInitializedEvent>并在发布事件时将容器从事件中拉出。
使用@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)还可以使用@LocalServerPort注释,如以下示例所示:
- 
Java 
- 
Kotlin 
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.web.server.LocalServerPort;
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class MyWebIntegrationTests {
	@LocalServerPort
	int port;
	// ...
}import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment
import org.springframework.boot.test.web.server.LocalServerPort
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class MyWebIntegrationTests {
	@LocalServerPort
	var port = 0
	// ...
}| 
 | 
启用 HTTP 响应压缩
Jetty、Tomcat、Reactor Netty 和 Undertow 支持 HTTP 响应压缩。
它可以在application.properties如下:
- 
Properties 
- 
YAML 
server.compression.enabled=trueserver:
  compression:
    enabled: true默认情况下,响应的长度必须至少为 2048 字节才能执行压缩。
您可以通过设置server.compression.min-response-size财产。
默认情况下,仅当响应的内容类型为以下内容类型之一时,才会压缩响应:
- 
text/html
- 
text/xml
- 
text/plain
- 
text/css
- 
text/javascript
- 
application/javascript
- 
application/json
- 
application/xml
您可以通过设置server.compression.mime-types财产。
配置 SSL
SSL 可以通过设置各种server.ssl.*属性,通常在application.properties或application.yaml.
看Ssl有关所有受支持属性的详细信息。
以下示例显示使用 Java KeyStore 文件设置 SSL 属性:
- 
Properties 
- 
YAML 
server.port=8443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=secret
server.ssl.key-password=another-secretserver:
  port: 8443
  ssl:
    key-store: "classpath:keystore.jks"
    key-store-password: "secret"
    key-password: "another-secret"使用上述示例等配置意味着应用程序不再支持端口 8080 处的纯 HTTP 连接器。
Spring Boot 不支持通过 HTTP 连接器和 HTTPS 连接器的配置application.properties.
如果要同时拥有两者,则需要以编程方式配置其中一个。
我们建议使用application.properties配置 HTTPS,因为 HTTP 连接器是两者中更容易以编程方式配置的。
使用 PEM 编码的文件
您可以使用 PEM 编码的文件而不是 Java KeyStore 文件。
应尽可能使用 PKCS#8 密钥文件。
PEM 编码的 PKCS#8 密钥文件以-----BEGIN PRIVATE KEY-----或-----BEGIN ENCRYPTED PRIVATE KEY-----页眉。
如果您有其他格式的文件,例如 PKCS#1 (-----BEGIN RSA PRIVATE KEY-----) 或 SEC 1 (-----BEGIN EC PRIVATE KEY-----),您可以使用 OpenSSL 将它们转换为 PKCS#8:
openssl pkcs8 -topk8 -nocrypt -in <input file> -out <output file>以下示例显示使用 PEM 编码的证书和私钥文件设置 SSL 属性:
- 
Properties 
- 
YAML 
server.port=8443
server.ssl.certificate=classpath:my-cert.crt
server.ssl.certificate-private-key=classpath:my-cert.key
server.ssl.trust-certificate=classpath:ca-cert.crtserver:
  port: 8443
  ssl:
    certificate: "classpath:my-cert.crt"
    certificate-private-key: "classpath:my-cert.key"
    trust-certificate: "classpath:ca-cert.crt"使用 SSL 捆绑包
或者,可以在 SSL 捆绑包中配置 SSL 信任材料并将其应用于 Web 服务器,如以下示例所示:
- 
Properties 
- 
YAML 
server.port=8443
server.ssl.bundle=exampleserver:
  port: 8443
  ssl:
    bundle: "example"| 这 这 | 
配置服务器名称指示
Tomcat、Netty 和 Undertow 可以配置为对单个主机名使用唯一的 SSL 信任材料,以支持服务器名称指示 (SNI)。 Jetty 不支持 SNI 配置,但如果向 Jetty 提供了多个证书,则可以自动设置 SNI。
假设名为web,web-alt1和web-alt2已配置,则可以使用以下配置将每个捆绑包分配给嵌入式 Web 服务器提供的主机名:
- 
Properties 
- 
YAML 
server.port=8443
server.ssl.bundle=web
server.ssl.server-name-bundles[0].server-name=alt1.example.com
server.ssl.server-name-bundles[0].bundle=web-alt1
server.ssl.server-name-bundles[1].server-name=alt2.example.com
server.ssl.server-name-bundles[1].bundle=web-alt2server:
  port: 8443
  ssl:
    bundle: "web"
    server-name-bundles:
      - server-name: "alt1.example.com"
        bundle: "web-alt1"
      - server-name: "alt2.example.com"
        bundle: "web-alt2"使用server.ssl.bundle将用于默认主机以及任何支持 SNI 的客户端。
如果有,则必须配置此默认捆绑包server.ssl.server-name-bundles已配置。
配置 HTTP/2
您可以使用 Spring Boot 应用程序中的 HTTP/2 支持server.http2.enabledconfiguration 属性。
双h2(基于 TLS 的 HTTP/2)和h2c(基于 TCP 的 HTTP/2)。
使用h2,还必须启用 SSL。
未启用 SSL 时,h2c将被使用。
例如,您可能想要使用h2c当应用程序在执行 TLS 终止的代理服务器后面运行时。
HTTP/2 与 Tomcat
Spring Boot 默认附带 Tomcat 10.1.x,它支持h2c和h2开箱即用。或者,您可以使用libtcnative为h2如果库及其依赖项安装在主机作系统上,则支持。
库目录必须可用于 JVM 库路径(如果尚未提供)。您可以使用 JVM 参数(例如-Djava.library.path=/usr/local/opt/tomcat-native/lib. 更多关于这方面的信息,请参阅官方 Tomcat 文档。
HTTP/2 与Jetty
对于 HTTP/2 支持,Jetty 需要额外的org.eclipse.jetty.http2:jetty-http2-serverDependency。
使用h2c不需要其他依赖项。
使用h2,您还需要选择以下依赖项之一,具体取决于您的部署:
- 
org.eclipse.jetty:jetty-alpn-java-server使用 JDK 内置支持
- 
org.eclipse.jetty:jetty-alpn-conscrypt-server和 Conscrypt 库
HTTP/2 与 Reactor Netty
这spring-boot-webflux-starter默认使用 Reactor Netty 作为服务器。Reactor Netty 支持h2c和h2开箱即用。为了获得最佳运行时性能,此服务器还支持h2使用本机库。要实现这一点,您的应用程序需要具有额外的依赖项。
Spring Boot 管理io.netty:netty-tcnative-boringssl-static“uber jar”,包含适用于所有平台的本机库。开发人员可以选择使用分类器仅导入所需的依赖项(参见 Netty 官方文档)。
配置 Web 服务器
通常,您应该首先考虑使用许多可用的配置密钥之一,并通过在application.properties或application.yaml文件。 请参阅发现外部属性的内置选项)。 这server.*命名空间在这里非常有用,它包括像server.tomcat.*,server.jetty.*和其他,用于特定于服务器的功能。请参阅通用应用程序属性列表。
前面的部分已经涵盖了许多常见用例,例如压缩、SSL 或 HTTP/2。但是,如果您的用例不存在配置密钥,则应查看WebServerFactoryCustomizer. 您可以声明这样的组件并访问与您的选择相关的服务器工厂:您应该为所选服务器(Tomcat、Jetty、Reactor Netty、Undertow)和所选 Web 堆栈(servlet 或响应式)选择变体。
下面的示例适用于 Tomcat,其中spring-boot-starter-web(servlet 堆栈):
- 
Java 
- 
Kotlin 
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;
@Component
public class MyTomcatWebServerCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
	@Override
	public void customize(TomcatServletWebServerFactory factory) {
		// customize the factory here
	}
}import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
import org.springframework.boot.web.server.WebServerFactoryCustomizer
import org.springframework.stereotype.Component
@Component
class MyTomcatWebServerCustomizer : WebServerFactoryCustomizer<TomcatServletWebServerFactory?> {
	override fun customize(factory: TomcatServletWebServerFactory?) {
		// customize the factory here
	}
}| Spring Boot 在内部使用该基础设施来自动配置服务器。自动配置 WebServerFactoryCustomizer豆子的顺序为0并将在任何用户定义的定制器之前进行处理,除非它有另有说明的显式顺序。 | 
一旦您有权访问WebServerFactory使用定制器,您可以使用它来配置特定部分,例如连接器、服务器资源或服务器本身 - 所有这些都使用特定于服务器的 API。
此外,Spring Boot 还提供:
| 服务器 | Servlet 堆栈 | 响应式堆栈 | 
|---|---|---|
| Tomcat | ||
| Jetty | ||
| Undertow | ||
| 反应器 | 不适用 | 
作为最后的手段,您也可以声明自己的WebServerFactorybean,它将覆盖 Spring Boot 提供的那个。
执行此作时,自动配置的定制器仍会应用于自定义工厂,因此请谨慎使用该选项。
将 Servlet、过滤器或侦听器添加到应用程序
在 servlet 堆栈应用程序中,即使用spring-boot-starter-web,有两种方式可以添加Servlet,Filter,ServletContextListener,以及 Servlet API 支持的其他侦听器到您的应用程序:
使用 Spring Bean 添加 Servlet、过滤器或侦听器
要添加一个Servlet,Filter或 Servlet*Listener通过使用 Spring bean,您必须提供@Bean它的定义。
当您想要注入配置或依赖项时,这样做可能非常有用。
但是,您必须非常小心,不要让它们导致太多其他 bean 的急切初始化,因为它们必须在应用程序生命周期的早期安装在容器中。
(例如,让他们依赖您的DataSource或 JPA 配置。
您可以通过在首次使用时而不是在初始化时延迟初始化 Bean 来绕过此类限制。
对于过滤器和 servlet,您还可以通过添加FilterRegistrationBean或ServletRegistrationBean而不是底层组件或附加组件。
| 如果没有 | 
与任何其他 Spring Bean 一样,您可以定义 servlet 过滤 Bean 的顺序;请务必检查将 Servlet、过滤器和侦听器注册为 Spring Beans 部分。
禁用 Servlet 或过滤器的注册
如前所述,任何Servlet或FilterBean 会自动注册到 Servlet 容器中。
禁用特定Filter或Servletbean,为其创建一个注册 bean 并将其标记为禁用,如以下示例所示:
- 
Java 
- 
Kotlin 
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class MyFilterConfiguration {
	@Bean
	public FilterRegistrationBean<MyFilter> registration(MyFilter filter) {
		FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>(filter);
		registration.setEnabled(false);
		return registration;
	}
}import org.springframework.boot.web.servlet.FilterRegistrationBean
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration(proxyBeanMethods = false)
class MyFilterConfiguration {
	@Bean
	fun registration(filter: MyFilter): FilterRegistrationBean<MyFilter> {
		val registration = FilterRegistrationBean(filter)
		registration.isEnabled = false
		return registration
	}
}使用类路径扫描添加 Servlet、过滤器和侦听器
@WebServlet,@WebFilter和@WebListener通过注释@Configuration类与@ServletComponentScan并指定包含要注册的组件的包。
默认情况下,@ServletComponentScan从带注释的类的包中扫描。
配置访问日志记录
可以通过各自的命名空间为 Tomcat、Undertow 和 Jetty 配置访问日志。
例如,以下设置使用自定义模式记录 Tomcat 上的访问。
- 
Properties 
- 
YAML 
server.tomcat.basedir=my-tomcat
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%t %a %r %s (%D microseconds)server:
  tomcat:
    basedir: "my-tomcat"
    accesslog:
      enabled: true
      pattern: "%t %a %r %s (%D microseconds)"| 日志的默认位置是 logs相对于 Tomcat 基本目录的目录。
默认情况下,logs目录是一个临时目录,因此您可能希望修复 Tomcat 的基目录或使用日志的绝对路径。
在前面的示例中,日志在my-tomcat/logs相对于应用程序的工作目录。 | 
可以以类似的方式配置 Undertow 的访问日志记录,如以下示例所示:
- 
Properties 
- 
YAML 
server.undertow.accesslog.enabled=true
server.undertow.accesslog.pattern=%t %a %r %s (%D milliseconds)
server.undertow.options.server.record-request-start-time=trueserver:
  undertow:
    accesslog:
      enabled: true
      pattern: "%t %a %r %s (%D milliseconds)"
    options:
      server:
        record-request-start-time: true请注意,除了启用访问日志记录和配置其模式外,还启用了记录请求开始时间。
当包括响应时间 (%D) 在访问日志模式中。
日志存储在logs相对于应用程序工作目录的目录。
您可以通过设置server.undertow.accesslog.dir财产。
最后,Jetty 的访问日志记录也可以配置如下:
- 
Properties 
- 
YAML 
server.jetty.accesslog.enabled=true
server.jetty.accesslog.filename=/var/log/jetty-access.logserver:
  jetty:
    accesslog:
      enabled: true
      filename: "/var/log/jetty-access.log"默认情况下,日志被重定向到System.err.
有关更多详细信息,请参阅 Jetty 文档。
在前端代理服务器后面运行
如果您的应用程序在代理、负载均衡器或云中运行,则请求信息(如主机、端口、方案等)可能会在此过程中发生变化。
您的应用程序可能在10.10.10.10:8080,但 HTTP 客户端应该只看到example.org.
RFC7239“转发标头”定义了ForwardedHTTP 标头;代理可以使用此标头提供有关原始请求的信息。
您可以将应用程序配置为读取这些标头,并在创建链接并将其发送到 HTTP 302 响应、JSON 文档或 HTML 页面中的客户端时自动使用该信息。
还有非标准标头,例如X-Forwarded-Host,X-Forwarded-Port,X-Forwarded-Proto,X-Forwarded-Ssl和X-Forwarded-Prefix.
如果代理将常用的X-Forwarded-For和X-Forwarded-Proto标题, 设置server.forward-headers-strategy自NATIVE足以支持这些。
使用此选项,Web 服务器本身本身支持此功能;您可以查看他们的特定文档以了解具体行为。
如果这还不够,Spring Framework 为 servlet 堆栈提供了 ForwardedHeaderFilter,为响应式堆栈提供了 ForwardedHeaderTransformer。
您可以通过设置server.forward-headers-strategy自FRAMEWORK.
| 如果您使用 Tomcat 并在代理处终止 SSL, server.tomcat.redirect-context-root应设置为false. 这允许X-Forwarded-Proto标头。 | 
| 如果您的应用程序在受支持的 Cloud Platform 中运行,则 server.forward-headers-strategy属性默认为NATIVE.
在所有其他情况下,它默认为NONE. | 
自定义 Tomcat 的代理配置
如果使用 Tomcat,则可以额外配置用于携带“转发”信息的标头的名称,如以下示例所示:
- 
Properties 
- 
YAML 
server.tomcat.remoteip.remote-ip-header=x-your-remote-ip-header
server.tomcat.remoteip.protocol-header=x-your-protocol-headerserver:
  tomcat:
    remoteip:
      remote-ip-header: "x-your-remote-ip-header"
      protocol-header: "x-your-protocol-header"Tomcat 还配置了一个正则表达式,该正则表达式与要信任的内部代理匹配。
请参阅server.tomcat.remoteip.internal-proxies附录中的条目为其默认值。
您可以通过添加一个条目来自定义阀门的配置application.properties,如以下示例所示:
- 
Properties 
- 
YAML 
server.tomcat.remoteip.internal-proxies=192\.168\.\d{1,3}\.\d{1,3}server:
  tomcat:
    remoteip:
      internal-proxies: "192\\.168\\.\\d{1,3}\\.\\d{1,3}"| 您可以通过设置 internal-proxies清空(但在生产中不要这样做)。 | 
您可以完全控制 Tomcat 的RemoteIpValve通过关闭自动按钮(为此,请将server.forward-headers-strategy=NONE)并使用WebServerFactoryCustomizer豆。
使用 Tomcat 启用多个连接器
您可以添加一个Connector到TomcatServletWebServerFactory,可以允许多个连接器,包括 HTTP 和 HTTPS 连接器,如以下示例所示:
- 
Java 
- 
Kotlin 
import org.apache.catalina.connector.Connector;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class MyTomcatConfiguration {
	@Bean
	public WebServerFactoryCustomizer<TomcatServletWebServerFactory> connectorCustomizer() {
		return (tomcat) -> tomcat.addAdditionalTomcatConnectors(createConnector());
	}
	private Connector createConnector() {
		Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
		connector.setPort(8081);
		return connector;
	}
}import org.apache.catalina.connector.Connector
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory
import org.springframework.boot.web.server.WebServerFactoryCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration(proxyBeanMethods = false)
class MyTomcatConfiguration {
	@Bean
	fun connectorCustomizer(): WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
		return WebServerFactoryCustomizer { tomcat: TomcatServletWebServerFactory ->
			tomcat.addAdditionalTomcatConnectors(
				createConnector()
			)
		}
	}
	private fun createConnector(): Connector {
		val connector = Connector("org.apache.coyote.http11.Http11NioProtocol")
		connector.port = 8081
		return connector
	}
}启用 Tomcat 的 MBean 注册表
默认情况下,嵌入式 Tomcat 的 MBean 注册表处于禁用状态。
这最大限度地减少了 Tomcat 的内存占用。
例如,如果您想使用 Tomcat 的 MBean,以便 Micrometer 可以使用它们来公开指标,则必须使用server.tomcat.mbeanregistry.enabled属性来执行此作,如以下示例所示:
- 
Properties 
- 
YAML 
server.tomcat.mbeanregistry.enabled=trueserver:
  tomcat:
    mbeanregistry:
      enabled: true使用 Undertow 启用多个监听器
添加一个UndertowBuilderCustomizer到UndertowServletWebServerFactory并将监听器添加到io.undertow.Undertow.Builder,如以下示例所示:
- 
Java 
- 
Kotlin 
import io.undertow.Undertow.Builder;
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class MyUndertowConfiguration {
	@Bean
	public WebServerFactoryCustomizer<UndertowServletWebServerFactory> undertowListenerCustomizer() {
		return (factory) -> factory.addBuilderCustomizers(this::addHttpListener);
	}
	private Builder addHttpListener(Builder builder) {
		return builder.addHttpListener(8080, "0.0.0.0");
	}
}import io.undertow.Undertow
import org.springframework.boot.web.embedded.undertow.UndertowBuilderCustomizer
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory
import org.springframework.boot.web.server.WebServerFactoryCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration(proxyBeanMethods = false)
class MyUndertowConfiguration {
	@Bean
	fun undertowListenerCustomizer(): WebServerFactoryCustomizer<UndertowServletWebServerFactory> {
		return WebServerFactoryCustomizer { factory: UndertowServletWebServerFactory ->
			factory.addBuilderCustomizers(
				UndertowBuilderCustomizer { builder: Undertow.Builder -> addHttpListener(builder) })
		}
	}
	private fun addHttpListener(builder: Undertow.Builder): Undertow.Builder {
		return builder.addHttpListener(8080, "0.0.0.0")
	}
}使用 @ServerEndpoint 创建 WebSocket 端点
如果你想使用@ServerEndpoint在使用嵌入式容器的 Spring Boot 应用程序中,您必须声明单个ServerEndpointExporter @Bean,如以下示例所示:
- 
Java 
- 
Kotlin 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration(proxyBeanMethods = false)
public class MyWebSocketConfiguration {
	@Bean
	public ServerEndpointExporter serverEndpointExporter() {
		return new ServerEndpointExporter();
	}
}import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.web.socket.server.standard.ServerEndpointExporter
@Configuration(proxyBeanMethods = false)
class MyWebSocketConfiguration {
	@Bean
	fun serverEndpointExporter(): ServerEndpointExporter {
		return ServerEndpointExporter()
	}
}前面示例中显示的 bean 注册任何@ServerEndpoint带有底层 WebSocket 容器的 Comments Bean。
当部署到独立的 servlet 容器时,此角色由 servlet 容器初始值设定项执行,并且ServerEndpointExporter不需要 bean。