此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1! |
每个 Spring Boot Web 应用程序都包含一个嵌入式 Web 服务器。 此功能会导致许多操作方法问题,包括如何更改嵌入式服务器以及如何配置嵌入式服务器。 本节回答了这些问题。
使用其他 Web 服务器
许多 Spring Boot 启动器都包含默认的嵌入式容器。
-
对于 servlet 堆栈应用程序,包含 Tomcat by include ,但您可以改用 或。
spring-boot-starter-web
spring-boot-starter-tomcat
spring-boot-starter-jetty
spring-boot-starter-undertow
-
对于反应式堆栈应用程序,可以通过包含 来包括 Reactor Netty,但您可以使用 、 或代替。
spring-boot-starter-webflux
spring-boot-starter-reactor-netty
spring-boot-starter-tomcat
spring-boot-starter-jetty
spring-boot-starter-undertow
切换到其他 HTTP 服务器时,您需要将默认依赖项交换为所需的依赖项。 为了帮助完成此过程,Spring Boot 为每个受支持的 HTTP 服务器提供了一个单独的启动器。
以下 Maven 示例演示如何排除 Tomcat 并包含 Spring MVC 的 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 代替 Reactor Netty for Spring WebFlux:
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 是使用该类所必需的,因此即使需要包含不同的 HTTP 服务器,也可能需要保留对 Netty 的依赖关系。WebClient |
spring-boot-starter-reactor-netty 是使用该类所必需的,因此即使需要包含不同的 HTTP 服务器,也可能需要保留对 Netty 的依赖关系。WebClient |
禁用 Web 服务器
如果您的类路径包含启动 Web 服务器所需的位,则 Spring Boot 将自动启动它。
若要禁用此行为,请在 中配置 ,如以下示例所示:WebApplicationType
application.properties
-
Properties
-
YAML
spring.main.web-application-type=none
spring:
main:
web-application-type: "none"
更改 HTTP 端口
在独立应用程序中,主 HTTP 端口默认为但可以设置为(例如,在 System 属性中或作为 System 属性)。
由于宽松的值绑定,您还可以使用(例如,作为操作系统环境变量)。8080
server.port
application.properties
Environment
SERVER_PORT
要完全关闭 HTTP 端点,但仍会创建一个 ,请使用(这样做有时对测试很有用)。WebApplicationContext
server.port=-1
有关详细信息,请参阅“Spring Boot 功能”部分中的“自定义嵌入式 Servlet 容器”或 ServerProperties
类。
在运行时发现 HTTP 端口
您可以从日志输出或通过其 .
获取它并确保它已初始化的最佳方法是添加一个 of 类型,并在发布时将容器从事件中拉出。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=true
server:
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。
有关所有受支持属性的详细信息,请参阅 Sl
。server.ssl.*
application.properties
application.yaml
以下示例演示如何使用 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-secret
server:
port: 8443
ssl:
key-store: "classpath:keystore.jks"
key-store-password: "secret"
key-password: "another-secret"
使用上述示例中的配置意味着应用程序不再支持端口 8080 上的纯 HTTP 连接器。
Spring Boot 不支持通过 配置 HTTP 连接器和 HTTPS 连接器。
如果要同时拥有两者,则需要以编程方式配置其中一个。
我们建议使用来配置 HTTPS,因为 HTTP 连接器是两者中更容易以编程方式配置的。application.properties
application.properties
使用 PEM 编码的文件
您可以使用 PEM 编码的文件,而不是 Java KeyStore 文件。
应尽可能使用 PKCS#8 密钥文件。
PEM 编码的 PKCS#8 密钥文件以 OR 标头开头。-----BEGIN PRIVATE KEY-----
-----BEGIN ENCRYPTED PRIVATE KEY-----
如果您有其他格式的文件,例如 PKCS#1 () 或 SEC 1 (),则可以使用 OpenSSL 将它们转换为 PKCS#8:-----BEGIN RSA PRIVATE KEY-----
-----BEGIN EC PRIVATE KEY-----
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.crt
server:
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=example
server:
port: 8443
ssl:
bundle: "example"
该属性不能与 下的离散 Java KeyStore 或 PEM 属性选项结合使用。server.ssl.bundle server.ssl |
配置服务器名称指示
Tomcat、Netty 和 Undertow 可以配置为对单个主机名使用唯一的 SSL 信任材料,以支持服务器名称指示 (SNI)。 Jetty 不支持 SNI 配置,但如果向 Jetty 提供了多个证书,则可以自动设置 SNI。
假设已配置名为 、 和 的 SSL 捆绑包,则可以使用以下配置将每个捆绑包分配给嵌入式 Web 服务器提供的主机名:web
web-alt1
web-alt2
-
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-alt2
server:
port: 8443
ssl:
bundle: "web"
server-name-bundles:
- server-name: "alt1.example.com"
bundle: "web-alt1"
- server-name: "alt2.example.com"
bundle: "web-alt2"
指定的捆绑包将用于默认主机,以及任何支持 SNI 的客户端。
如果配置了任何捆绑包,则必须配置此默认捆绑包。server.ssl.bundle
server.ssl.server-name-bundles
该属性不能与 下的离散 Java KeyStore 或 PEM 属性选项结合使用。server.ssl.bundle server.ssl |
配置 HTTP/2
您可以使用 configuration 属性在 Spring Boot 应用程序中启用 HTTP/2 支持。
支持 (HTTP/2 over TLS) 和 (HTTP/2 over TCP)。
要使用 ,还必须启用 SSL。
当未启用 SSL 时,将使用。
例如,当应用程序在执行 TLS 终止的代理服务器后面运行时,您可能希望使用。server.http2.enabled
h2
h2c
h2
h2c
h2c
使用 Tomcat 的 HTTP/2
Spring Boot 默认随 Tomcat 10.1.x 一起提供,它支持并且开箱即用。
或者,如果库及其依赖项安装在主机操作系统上,则可以使用支持。h2c
h2
libtcnative
h2
库目录必须可用于 JVM 库路径(如果尚未提供)。
您可以使用 JVM 参数(如 )来实现此目的。
有关此内容的更多信息,请参阅 Tomcat 官方文档。-Djava.library.path=/usr/local/opt/tomcat-native/lib
HTTP/2 与 Jetty
对于 HTTP/2 支持,Jetty 需要额外的依赖项。
若要使用,不需要其他依赖项。
若要使用 ,还需要选择以下依赖项之一,具体取决于您的部署:org.eclipse.jetty.http2:jetty-http2-server
h2c
h2
-
org.eclipse.jetty:jetty-alpn-java-server
使用 JDK 内置支持 -
org.eclipse.jetty:jetty-alpn-conscrypt-server
和 Conscrypt 库
带有 Reactor Netty 的 HTTP/2
默认情况下,使用 Reactor Netty 作为服务器。
Reactor Netty 支持并开箱即用。
为了获得最佳运行时性能,此服务器还支持本机库。
若要启用此功能,应用程序需要具有额外的依赖项。spring-boot-webflux-starter
h2c
h2
h2
Spring Boot 管理“uber jar”的版本,其中包含所有平台的本机库。
开发人员可以选择使用分类器仅导入所需的依赖项(参见 Netty 官方文档)。io.netty:netty-tcnative-boringssl-static
配置 Web 服务器
通常,您应该首先考虑使用许多可用的配置键之一,并通过在 or 文件中添加新条目来自定义 Web 服务器(请参阅“发现外部属性的内置选项”)。
命名空间在这里非常有用,它包括用于特定于服务器的功能的命名空间,例如 和其他命名空间。
请参阅常见应用程序属性列表。application.properties
application.yaml
server.*
server.tomcat.*
server.jetty.*
前面的章节已经介绍了许多常见的用例,例如压缩、SSL 或 HTTP/2。
但是,如果您的用例不存在配置键,则应查看 WebServerFactoryCustomizer
。
您可以声明这样的组件并访问与您的选择相关的服务器工厂:您应该为所选服务器(Tomcat、Jetty、Reactor Netty、Undertow)和所选 Web 堆栈(servlet 或 reactive)选择变体。
下面的示例是 Tomcat 的 (servlet 堆栈):spring-boot-starter-web
-
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 在内部使用该基础结构来自动配置服务器。
自动配置的 Bean 的顺序为 并且将在任何用户定义的定制器之前进行处理,除非它具有另有说明的显式顺序。WebServerFactoryCustomizer 0 |
使用定制器访问定制器后,可以使用它来配置特定部分,例如连接器、服务器资源或服务器本身 - 所有这些都使用特定于服务器的 API。WebServerFactory
此外,Spring Boot 还提供:
服务器 | Servlet 堆栈 | 反应式堆栈 |
---|---|---|
雄猫 |
|
|
码头 |
|
|
退波 |
|
|
反应器 |
不适用 |
|
作为最后的手段,您还可以声明自己的 bean,这将覆盖 Spring Boot 提供的 bean。
执行此操作时,自动配置的定制器仍会应用于自定义工厂,因此请谨慎使用该选项。WebServerFactory
Spring Boot 在内部使用该基础结构来自动配置服务器。
自动配置的 Bean 的顺序为 并且将在任何用户定义的定制器之前进行处理,除非它具有另有说明的显式顺序。WebServerFactoryCustomizer 0 |
服务器 | Servlet 堆栈 | 反应式堆栈 |
---|---|---|
雄猫 |
|
|
码头 |
|
|
退波 |
|
|
反应器 |
不适用 |
|
向应用程序添加 Servlet、过滤器或侦听器
在 servlet 堆栈应用程序中,即使用 ,有两种方法可以将 、 、 和 Servlet API 支持的其他侦听器添加到应用程序中:spring-boot-starter-web
Servlet
Filter
ServletContextListener
使用 Spring Bean 添加 Servlet、过滤器或侦听器
要使用 Spring Bean 添加 、 或 servlet,必须为其提供定义。
当您想要注入配置或依赖项时,这样做非常有用。
但是,您必须非常小心,以免它们导致太多其他 Bean 的紧急初始化,因为它们必须在应用程序生命周期的早期安装在容器中。
(例如,让它们依赖于您或 JPA 配置并不是一个好主意。
您可以通过在首次使用时延迟初始化 Bean 而不是在初始化时初始化 Bean 来解决此类限制。Servlet
Filter
*Listener
@Bean
DataSource
对于过滤器和 servlet,您还可以通过添加 a 或 a 来代替或添加基础组件来添加映射和 init 参数。FilterRegistrationBean
ServletRegistrationBean
如果在筛选器注册上指定了 no,则使用。
这与 servlet 规范的缺省调度程序类型一致。 |
与任何其他 Spring Bean 一样,您可以定义 servlet 过滤 Bean 的顺序;请务必查看“将 Servlet、过滤器和侦听器注册为 Spring Beans”部分。
禁用 Servlet 或过滤器的注册
如前所述,any 或 bean 会自动注册到 servlet 容器中。
要禁用特定 Bean 或 Bean 的注册,请为其创建一个注册 Bean 并将其标记为禁用,如以下示例所示:Servlet
Filter
Filter
Servlet
-
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
}
}
如果在筛选器注册上指定了 no,则使用。
这与 servlet 规范的缺省调度程序类型一致。 |
配置访问日志记录
可以通过 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)"
日志的默认位置是相对于 Tomcat 基目录的目录。
默认情况下,该目录是一个临时目录,因此您可能需要修复 Tomcat 的基目录或使用日志的绝对路径。
在前面的示例中,日志相对于应用程序的工作目录可用。logs logs 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=true
server:
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.log
server:
jetty:
accesslog:
enabled: true
filename: "/var/log/jetty-access.log"
默认情况下,日志将重定向到 。
有关详细信息,请参阅 Jetty 文档。System.err
日志的默认位置是相对于 Tomcat 基目录的目录。
默认情况下,该目录是一个临时目录,因此您可能需要修复 Tomcat 的基目录或使用日志的绝对路径。
在前面的示例中,日志相对于应用程序的工作目录可用。logs logs my-tomcat/logs |
在前端代理服务器后面运行
如果您的应用程序在代理、负载均衡器或云中运行,则请求信息(如主机、端口、方案等)可能会在此过程中发生变化。
您的应用程序可能运行在 上,但 HTTP 客户端应该只看到 。10.10.10.10:8080
example.org
RFC7239 “Forwarded Headers” 定义 HTTP 标头;代理可以使用此标头提供有关原始请求的信息。
您可以将应用程序配置为读取这些标头,并在创建链接并将其发送到 HTTP 302 响应、JSON 文档或 HTML 页面中的客户端时自动使用该信息。
还有一些非标准标头,如 、 、 、 和 。Forwarded
X-Forwarded-Host
X-Forwarded-Port
X-Forwarded-Proto
X-Forwarded-Ssl
X-Forwarded-Prefix
如果代理添加了常用的标头和标头,则设置为足以支持这些标头。
使用此选项,Web 服务器本身本身本身就支持此功能;您可以查看其特定文档以了解特定行为。X-Forwarded-For
X-Forwarded-Proto
server.forward-headers-strategy
NATIVE
如果这还不够,Spring Framework 为 servlet 堆栈提供了一个 ForwardedHeaderFilter,为反应式堆栈提供了一个 ForwardedHeaderTransformer。
您可以通过设置为 在应用程序中使用它们。server.forward-headers-strategy
FRAMEWORK
如果您使用 Tomcat 并在代理处终止 SSL,则应设置为 。
这允许在执行任何重定向之前尊重标头。server.tomcat.redirect-context-root false X-Forwarded-Proto |
如果应用程序在受支持的云平台中运行,则该属性默认为 。
在所有其他实例中,它默认为 。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-header
server:
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 |
您可以通过关闭自动配置(为此,请设置)并使用 bean 添加新的阀门实例来完全控制 Tomcat 的配置。RemoteIpValve
server.forward-headers-strategy=NONE
WebServerFactoryCustomizer
如果您使用 Tomcat 并在代理处终止 SSL,则应设置为 。
这允许在执行任何重定向之前尊重标头。server.tomcat.redirect-context-root false X-Forwarded-Proto |
如果应用程序在受支持的云平台中运行,则该属性默认为 。
在所有其他实例中,它默认为 。server.forward-headers-strategy NATIVE NONE |
您可以通过将 设置为空来信任所有代理(但在生产环境中不要这样做)。internal-proxies |
使用 Tomcat 启用多个连接器
可以向 添加一个,这样可以允许多个连接器,包括 HTTP 和 HTTPS 连接器,如以下示例所示:org.apache.catalina.connector.Connector
TomcatServletWebServerFactory
-
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=true
server:
tomcat:
mbeanregistry:
enabled: true
使用 Undertow 启用多个侦听器
将 an 添加到 并向 添加侦听器,如以下示例所示:UndertowBuilderCustomizer
UndertowServletWebServerFactory
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 端点
如果要在使用嵌入式容器的 Spring Boot 应用程序中使用,则必须声明单个 ,如以下示例所示:@ServerEndpoint
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 将任何带注释的 Bean 注册到底层 WebSocket 容器。
当部署到独立的 Servlet 容器时,此角色由 Servlet 容器初始值设定项执行,并且不需要 Bean。@ServerEndpoint
ServerEndpointExporter