Spring Boot 3.4 正式发布,结构化日志!
1 从 Spring Boot 3.3 升级到 3.4
1.1 RestClient 和 RestTemplate
新增对 RestClient
和 RestTemplate
自动配置的支持,可用 Reactor Netty 的 HttpClient
或 JDK 的 HttpClient
。支持的客户端优先级:
- Apache HTTP Components (
HttpComponentsClientHttpRequestFactory
) - Jetty Client (
JettyClientHttpRequestFactory
) - Reactor Netty 的
HttpClient
(ReactorClientHttpRequestFactory
) - JDK 的
HttpClient
(JdkClientHttpRequestFactory
) - 简单的 JDK
HttpURLConnection
(SimpleClientHttpRequestFactory
)
若类路径没有 HTTP 客户端库,默认可能用 JdkClientHttpRequestFactory
,而非之前的 SimpleClientHttpRequestFactory
。可以通过设置 spring.http.client.factory
来选择特定客户端,支持的值包括 http-components
、jetty
、reactor
、jdk
和 simple
。
所有五个客户端默认会遵循重定向。如需禁用此行为,可以将 spring.http.client.redirects
设置为 dont-follow
。
1.2 Apache HTTP Components 和 Envoy
Apache HTTP Components 的 HttpClient
在 HTTP/1.1 的 TLS 升级默认行为有所改变。虽然大多数代理服务器可以正确处理升级,但使用 Envoy 或 Istio 时可能会遇到问题。
如果需要恢复以前的行为,可用新的 ClientHttpRequestFactoryBuilder
。定义一个 HttpComponentsClientHttpRequestFactoryBuilder
并按以下方式自定义:
@Bean
public HttpComponentsClientHttpRequestFactoryBuilder httpComponentsClientHttpRequestFactoryBuilder() {return ClientHttpRequestFactoryBuilder.httpComponents().withDefaultRequestConfigCustomizer((builder) -> builder.setProtocolUpgradeEnabled(false));
}
1.3 配置属性的 Bean 验证
之前,当一个 @ConfigurationProperties
类标注了 @Validated
并通过 Bean Validation(如 Hibernate Validator)实现进行验证时,其嵌套属性会在绑定时被验证,无论是否使用 @Valid
。
Spring Boot 3.4 开始,验证行为与 Bean Validation 规范一致。验证从 @ConfigurationProperties
注解的类开始,并仅在嵌套属性对应的字段标注了 @Valid
时才进行级联验证。
升级时,请检查使用了 Bean Validation 约束的 @ConfigurationProperties
类,并在需要对嵌套属性进行级联验证的地方添加 @Valid
。
1.4 基于 Bean 的条件
@ConditionalOnBean
和 @ConditionalOnMissingBean
在 @Bean
方法中使用并设置了 annotation
属性时,其行为有所更改。两者仍然默认使用 @Bean
方法的返回类型作为匹配的默认类型。然而,从 Spring Boot 3.4 开始,如果设置了 annotation
,此默认值将不会被使用。如果需要恢复以前的行为,请同时指定一个与 @Bean
方法返回类型一致的 value
和 annotation
。
1.5 优雅关机
嵌入式 Web 服务器(Jetty、Reactor Netty、Tomcat 或 Undertow)的优雅关机功能现已默认启用。如需恢复之前的立即关机行为, server.shutdown
置 immediate
。
1.6 Paketo Tiny Builder 用于构建 OCI 镜像
在使用 Maven 的 spring-boot:build-image
目标为 JVM 应用程序构建 OCI 镜像时,默认的 Cloud Native Buildpacks 构建器已从 paketobuildpacks/builder-jammy-base
更改为 paketobuildpacks/builder-jammy-java-tiny
。这将生成更小的镜像。但由于 tiny
构建器不包含 shell,因此可能无法适用于需要通过启动脚本运行的应用程序。有关自定义构建器的详细信息,请参阅 Maven 文档。
1.7 使用 Testcontainers 定义动态属性
通过将 DynamicPropertyRegistry
注入到 @Bean
方法中来定义动态属性的功能已被弃用,现在默认会导致失败。替代方法是实现一个单独的 @Bean
方法,返回一个 DynamicPropertyRegistrar
,此方法应注入属性值来源的容器。这种方式解决了一些容器生命周期问题,并确保属性值来源的容器在属性被使用之前已经启动。
如果仍希望注入 DynamicPropertyRegistry
(需承担可能的生命周期问题),可以将 spring.testcontainers.dynamic-property-registry-injection
设置为 warn
或 allow
。前者会记录警告但允许注入,后者则会完全恢复 Spring Boot 3.3 的行为。
1.8 @AutoConfigureTestDatabase 与容器的集成
@AutoConfigureTestDatabase
注解现在会自动检测数据库是否来源于容器。如果是,则无需再添加 replace=Replace.NONE
。
如需恢复旧的行为,可以在注解中设置 replace=Replace.AUTO_CONFIGURED
。
1.9 控制 Actuator 端点的访问权限
启用和禁用端点的支持已被重新设计,替换为更细粒度的访问控制模型。新的模型不仅支持禁用端点(访问级别为 none
)和完全启用端点(访问级别为 unrestricted
),还支持只允许端点操作的“只读”访问(访问级别为 read-only
)。
以下属性已被弃用:
management.endpoints.enabled-by-default
management.endpoint.<id>.enabled
其替代属性为:
management.endpoints.access.default
management.endpoint.<id>.access
同样,@Endpoint
注解中的 enableByDefault
属性已被弃用,新的 defaultAccess
属性取代了它。
作为更改的一部分,enabled-by-default
的应用现在更加一致,并与是否使用了 @ConditionalOnEnabledEndpoint
无关。如果升级后失去了某个端点的访问权限,可以将 management.endpoint.<id>.access
设置为 read-only
或 unrestricted
,或者将 management.endpoint.<id>.enabled
设置为 true
,以使端点重新可用。
另外,还引入了一个新属性,用于控制 Actuator 端点访问级别的上限:
management.endpoints.access.max-permitted
此属性限制所有配置的访问级别。例如,如果 management.endpoints.access.max-permitted
设置为 read-only
,而 management.endpoint.loggers.access
设置为 unrestricted
,则日志记录端点仅允许只读访问。
1.10 Cloud Foundry 中 @ConditionalOnAvailableEndpoint 暴露的更改
在使用 @ConditionalOnAvailableEndpoint
注解时,原本使用的枚举值 EndpointExposure.CLOUD_FOUNDRY
已被弃用,建议改用 EndpointExposure.WEB
。对于典型的 Spring Boot 应用,这一更改通常不会有影响。但如果你定义了自定义的 Cloud Foundry 特定 Actuator 端点 bean,则需要将条件更新为使用 EndpointExposure.WEB
。
1.11 HtmlUnit 4.3
HtmlUnit 已升级至 4.3。本次升级中,依赖坐标从 net.sourceforge.htmlunit:htmlunit
变更为 org.htmlunit:htmlunit
,包名也从 com.gargoylesoftware.htmlunit.
更新为 org.htmlunit.
。升级时,请相应调整构建配置和代码导入。
1.12 Selenium HtmlUnit 4.22
Selenium HtmlUnit 已更新至 4.22。本次升级中,依赖坐标从 org.seleniumhq.selenium:htmlunit-driver
变更为 org.seleniumhq.selenium:htmlunit3-driver
。升级时,请相应调整构建配置。
1.13 WebJars 定位器集成
为了更快的启动时间和更高效的 WebJars 资源解析,你需要在构建文件(如 pom.xml)中将依赖从 org.webjars:webjars-locator-core
更新为 org.webjars:webjars-locator-lite
。这两项依赖由 Spring Boot 统一管理。需要注意,Spring 对 org.webjars:webjars-locator-core
的支持已被弃用,并将在未来版本中移除。有关详细信息,请参阅 参考文档的相关章节。
1.14 OkHttp 依赖管理的移除
Spring Boot 不再直接依赖 OkHttp,因此也不再对其版本进行管理。如果你的应用程序包含 OkHttp 依赖,请更新构建以选择适合需求的 OkHttp 版本。
1.15 原生镜像中的 Netty
Spring Boot 3.4 使用的 Netty 版本尚未完全被 Native Build Tools 提供的 GraalVM 可达性元数据支持。要在原生镜像中正常使用 Netty,需手动升级 GraalVM 可达性元数据版本。
对于 Maven:
<plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId><configuration><metadataRepository><version>0.3.14</version></metadataRepository></configuration>
</plugin>
1.16 @MockBean 和 @SpyBean 的弃用
@MockBean
和 @SpyBean
注解已被弃用,建议使用 Spring Framework 提供的 @MockitoBean
和 @MockitoSpyBean
。新的注解功能与 Spring Boot 提供的注解功能并不完全一致。例如,@MockitoBean
尚不支持在 @Configuration
类中使用,你可能需要在测试类中直接注解字段。
1.17 Spring Boot 3.2 的弃用项
Spring Boot 3.2 中标记为弃用并计划在 3.4 中移除的类、方法和属性现已被移除。在升级之前,请确保没有调用这些弃用的功能。
1.18 最低要求更改
2 新功能和亮点
2.1 结构化日志
新增了对结构化日志的支持,包括 Elastic Common Schema(ecs
)、Graylog 扩展日志格式(gelf
)和 Logstash(logstash
)的内置支持。可以通过设置 logging.structured.format.file
为 ecs
、gelf
或 logstash
来启用结构化文件日志记录。类似地,可以通过设置 logging.structured.format.console
来启用结构化控制台日志记录。
有关更多信息,包括如何定义自定义格式,请参阅参考文档。
@Fallback
Bean
@ConditionalOnSingleCandidate
现在支持 @Fallback
Bean。如果存在一个主 Bean,或者没有主 Bean 但存在一个非回退的单一候选 Bean,则该条件会匹配。
定义附加 Bean
在类型匹配时,基于 Bean 的条件现在会忽略非默认候选 Bean。通过声明某个 Bean 为非默认候选(使用 @Bean(defaultCandidate=false)
),现在可以定义一个特定类型的 Bean,而不会导致相同类型的自动配置 Bean 退出。这简化了配置,例如在同一个应用程序中使用 两个 DataSource
Bean 或 两个 EntityManagerFactory
Bean。
ClientHttpRequestFactory 构建器
新增了 ClientHttpRequestFactoryBuilder
接口,可以为特定技术创建 ClientHttpRequestFactory
实例。构建器支持对底层组件进行细粒度自定义,并提供一致的方式来应用通用设置。
以下构
建器可以通过接口的静态工厂方法创建:
- Apache HTTP Components(
ClientHttpRequestFactoryBuilder.httpComponents()
) - Jetty Client(
ClientHttpRequestFactoryBuilder.jetty()
) - Reactor Netty 的
HttpClient
(ClientHttpRequestFactoryBuilder.reactor()
) - JDK 的
HttpClient
(ClientHttpRequestFactoryBuilder.jdk()
) - 简单的 JDK
HttpURLConnection
(ClientHttpRequestFactoryBuilder.simple()
)
有关更多详细信息,包括如何通过配置属性应用通用设置,请参阅参考文档。
可观察性改进
应用程序分组
新增了 spring.application.group
属性,用于对应用程序进行分组,例如将属于某个业务部门的多个应用程序归类。当设置此属性时,它也会出现在日志消息中。此行为可通过 logging.include-application.group
属性控制。应用程序分组信息还会自动添加到 OpenTelemetry 的 Resource
中。
OTLP
支持通过 gRPC 传输发送 OTLP span。要启用此功能,请将新配置属性 management.otlp.tracing.transport
设置为 grpc
。该属性默认为 http
。此外,还新增了相应的服务连接支持。
新增的 management.otlp.logs
配置属性可用于自动配置 OpenTelemetry 的 OtlpHttpLogRecordExporter
和 SdkLoggerProvider
。
其他可观察性更新
ProcessInfoContributor
现在还会显示堆和非堆内存的使用信息。
新增的 management.otlp.tracing.export.enabled
、management.wavefront.tracing.export.enabled
和 management.zipkin.tracing.export.enabled
属性,可用于更细粒度地启用或禁用跟踪导出。
对 MockMvc 的 AssertJ 支持
当类路径中存在 AssertJ 时,将自动配置 MockMvcTester
。MockMvcTester
提供了一种流畅的 API,用于定义请求和断言。它可以在任何可以注入 MockMvc
的地方使用。
有关更多详细信息,请参阅 Spring Framework 参考文档的专用章节。
Spring Pulsar
Spring Boot 现在提供了配置默认租户和命名空间的属性。这些默认值适用于主题 URL 未完全限定时生产或消费消息的情况。可以通过 spring.pulsar.defaults.topic.tenant
和 spring.pulsar.defaults.topic.namespace
配置这些属性,或者定义自己的 PulsarTopicBuilder
bean。如果需要禁用默认值,将 spring.pulsar.defaults.topic.enabled=false
。
新增了 PulsarContainerFactoryCustomizer
接口,用于自定义自动配置的 PulsarContainerFactory
。
spring.pulsar.consumer.subscription.name
配置属性现在应用于自动配置的 Pulsar 监听器容器。
引入了两个用于配置 Pulsar 客户端并发性的属性:
spring.pulsar.client.threads.io
:控制用于处理与代理连接的线程数。spring.pulsar.client.threads.listener
:控制用于消息监听器的线程数。
此外,新属性 spring.pulsar.listener.concurrency
可控制自动配置的 Pulsar 消息监听器容器的并发性。
Couchbase 身份验证
Couchbase 集群现在支持通过客户端证书进行身份验证,作为用户名和密码身份验证的替代方案。详细信息请参阅参考文档。
FreeMarker
FreeMarker 变量现可通过定义一个或多个类型为 FreeMarkerVariablesCustomizer
的 bean 来自定义。自定义器将按定义的顺序(如果有)依次调用。
嵌入式 ActiveMQ Classic Broker 的支持
由于 ActiveMQ Classic 重新支持嵌入式 Broker,自动配置已更新以支持此功能。
需要注意,与 Spring Boot 2.7.x 不同,ActiveMQ starter 仅限于客户端。如果需要使用嵌入式 Broker,需要将 org.apache.activemq:activemq-broker
添加到应用程序中。
配置元数据
注解处理器现在支持检测 Enum
类型的默认值。如果你为自定义属性手动添加了元数据来提供默认值,请确保将其移除。
弃用和替换自动配置类
为简化自动配置的演进,Spring Boot 引入了对自动配置类的弃用和替换支持。替换可以在新的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.replacements
文件中声明。更多详情请参阅参考文档。
虚拟线程
如果启用了虚拟线程,以下组件将默认使用虚拟线程:
OtlpMeterRegistry
- Undertow Web 服务器
镜像构建改进
Spring Boot 默认使用 paketobuildpacks/builder-jammy-java-tiny
构建器。此构建器原生支持 ARM 和 x64 平台。
Maven插件新增了 trustBuilder
选项,用于控制 CNB 生命周期的调用方式,以提高安全性。默认信任的构建器包括 Paketo 项目、Heroku 和 Google 的构建器。详情请参阅 Maven文档。
新增的 imagePlatform
选项允许为不同于主机平台的操作系统和架构构建镜像,前提是主机平台支持模拟其他系统(
例如,使用 Apple Silicon 的 Mac 上的 Rosetta 模拟 AMD 架构)。详情请参阅 Maven文档。
Docker Compose 改进
Docker Compose 现在支持多个 Docker Compose 配置文件。
命令行参数
新属性 spring.docker.compose.start.arguments
和 spring.docker.compose.stop.arguments
可以用来指定在启动和停止服务时传递给 Docker Compose 子命令的额外命令行参数。新增了 spring.docker.compose.arguments
属性,用于向 Docker Compose 传递参数。
更新支持
- Postgres
POSTGRES_HOST_AUTH_METHOD=trust
环境变量 现在被支持。 - 通过分别使用
redis/redis-stack
和redis/redis-stack-server
容器镜像,添加了对 Redis Stack 和 Redis Stack Server 的支持。 - 通过使用
grafana/otel-lgtm
容器镜像,添加了对 Grafana LGTM 的支持。 - 添加了对 Hazelcast 的支持(使用
HazelcastConnectionDetails
)。 - 添加了对 OTLP 日志记录的支持。
Testcontainers 改进
- 添加了对
org.testcontainers.kafka.KafkaContainer
的支持。 - 通过分别使用
redis/redis-stack
和redis/redis-stack-server
容器镜像,添加了对 Redis Stack 和 Redis Stack Server 的支持。 - 添加了对
org.testcontainers.grafana.LgtmStackContainer
的支持。 - 添加了对 Hazelcast 的支持(使用
HazelcastConnectionDetails
)。 - 添加了对 OTLP 日志记录的支持。
- 添加了对
RedisContainer
的支持。
Actuator
可插拔的 Actuator 暴露器
现在可以扩展 Spring Boot,以可插拔的方式暴露 actuator 端点。可以实现新的 EndpointExposureOutcomeContributor
接口来影响 @ConditionalOnAvailableEndpoint
条件。
这个扩展应该使得提供类似我们现有的 Cloud Foundry 支持的额外平台集成变得更加容易。
SSL 信息和健康检查
如果您使用的是 SSL 包,现在有一个新端点显示 SSL 信息(有效期、发行者、主题等),可在 /actuator/info
下获取。该端点还会显示即将过期的证书,以提醒您需要尽快轮换证书。新增了名为 management.health.ssl.certificate-validity-warning-threshold
的配置属性来配置阈值。
还添加了一个新的健康检查来监控 SSL 证书。如果证书无效,它将状态设置为 OUT_OF_SERVICE
。
/actuator/scheduledtasks
端点中的额外信息
/scheduledtasks
Actuator 端点 现在公开了有关计划任务的额外元数据,例如 "下一次预定执行时间" 和 "上次执行时间、状态和异常"。
3 依赖升级
Spring Boot 3.4 迁移到了几个 Spring 项目的新版:
- Spring AMQP 3.2
- Spring Authorization Server 1.4
- Spring Batch 5.2
- Spring Data 2024.1
- Spring Framework 6.2
- Spring HATEOAS 2.4
- Spring Integration 6.4
- Spring Kafka 3.3
- Spring Pulsar 1.2
- Spring Security 6.4
- Spring Session 3.4
许多第三方依赖项也已更新,其中一些更值得注意的包括:
- Apache Http Client 5.4
- AssertJ 3.26
- Artemis 2.37
- Elasticsearch Client 8.15
- Flyway 10.20
- Gson 2.11
- Hibernate 6.6
- HtmlUnit 4.5.0
- JUnit Jupiter 5.11
- Jackson 2.18.0
- Jedis 5.2
- Kafka 3.8
- Lettuce 6.4
- Liquibase 4.29
- Log4j 2.24
- HtmlUnit 4.3
- MariaDB 3.4
- Micrometer 1.14
- Micrometer Tracing 1.4
- Mockito 5.13
- MongoDB 5.2.0
- MySQL 9.1
- OpenTelemetry 1.41
- Oracle Database 23.4
- R2DBC MySQL 1.3
- Rabbit AMQP Client 5.22
- Rabbit Stream Client 0.18.0
- Reactor 2024.0
- Selenium 4.25
- Testcontainers 1.20.3
- XMLUnit 2.10
杂项
除了上述变化外,还包括许多小的调整和改进:
- 现在可以使用
Customizer<Liquibase>
bean 在使用 Liquibase 之前对其进行自定义。 - 现在可以通过定义
JCachePropertiesCustomizer
bean 来自定义用于创建 JCacheCacheManager
的属性。 - 现在可以通过定义名为
viewNameTranslator
的 bean 来自定义 Spring MVC 使用的RequestToViewNameTranslator
。 - 现在可以使用
LettuceClientOptionsBuilderCustomizer
bean 来自定义 Lettuce 的ClientOptions
。对于整个LettuceClientConfiguration
的更广泛配置,继续使用LettuceClientConfigurationBuilderCustomizer
。 - 可以使用新的自定义器
ProxyConnectionFactoryCustomizer
来自定义 R2DBC 的ProxyConnectionFactory
。 - 如果发生 Spring Security 注销,现在会发布一个审计事件。
- 现在可以使用新的属性
spring.mail.ssl.*
通过 SSL 包配置JavaMailSender
上的 TLS。 - 现在可以使用新的
spring.gson.strictness
属性配置 GSON 的严格性。 - 现在可以在 JavaBean 风格的配置属性的字段上使用
@Name
来自定义其名称。 - 当从另一个
DataSource
派生时,DataSourceBuilder
现在可以使用源 DataSource 的 URL 确定驱动程序类名称,如果它不公开驱动程序类名称。 - 就绪和存活健康探针 现在在 Cloud Foundry 平台上自动启用。
- 可以使用新属性
spring.application.version
读取和设置应用程序版本。属性的默认值取自清单中的Implementation-Version
。 - 自动配置的
EntityManagerFactoryBuilder
也定义了原生(例如 Hibernate)属性。 - 即使没有使用
@EnableScheduling
,Spring Integration 的TaskScheduler
现在也支持虚拟线程。 @ConditionalOnAvailableEndpoint
现在有一个value
别名用于endpoint
。- 添加了一个新的配置属性
spring.data.web.pageable.serialization-mode
,用于配置 Spring Data Web 的序列化模式。 - 使用
SpringApplication.from(…)
语法时,现在可以指定要激活的额外配置文件。 - Spring Boot 插件不再在构建包环境中设置
BP_NATIVE_IMAGE: true
。 - 注册的
@ConfigurationProperties
beans 现在尊重@DependsOn
、@Description
、@Fallback
、@Lazy
、@Primary
、@Scope
和@Role
注解。 - 现在支持 Log4j2 的
MultiFormatStringBuilderFormattable
在结构化日志中。 - 添加了一个新的配置属性
spring.jms.listener.max-messages-per-task
,用于配置监听器在单个任务中处理的最大消息数。 - 默认的安全配置现在暴露了映射到附加路径的健康组。此外,两个
EndpointRequest
类现在提供了toAdditionalPaths(…)
方法。 - 现在可以通过属性设置会话 cookie 的分区属性。
- 添加了一个新的
server.jetty.max-form-keys
属性,用于自定义 Jetty 的最大表单键。 - 添加了新的属性
management.otlp.logging.connect-timeout
和management.otlp.tracing.connect-timeout
以配置与 OTLP 收集器的连接超时。 - 添加了通过 OTLP 传输日志时的 gRPC 传输支持。
- 如果在构建过程中绑定了容器中使用的目录,现在会显示警告。
- 如果使用
--enable-sbom=sbom
构建原生镜像,现在会自动检测到这个 SBOM。 DatabaseDriver
枚举现在支持 ClickHouse JDBC 驱动程序。- 可以使用新属性
management.logging.export.enabled
- 和
management.otlp.logging.export.enabled
禁用日志导出。- 可以通过定义带有
@BatchTaskExectuor
注解的TaskExecutor
bean 来自定义 Spring Batch 使用的TaskExecutor
。 - Spring Session 自动配置现在支持响应式 Web 应用程序中的
indexed
存储库类型。 - 如果未配置池挂起并且创建了检查点,
HikariCheckpointRestoreLifecycle
现在会记录一条警告。
- 可以通过定义带有
3.4 版本 Spring Boot 的弃用
- 弃用
spring.gson.lenient
,改用spring.gson.strictness
。 - 弃用
@MockBean
和@SpyBean
,改用 Spring Framework 的@MockitoBean
和MockitoSpyBean
。 - 弃用
org.springframework.boot.ResourceBanner#getApplicationVersion(Class<?>)
,改用spring.application.version
属性。 - 弃用
org.springframework.boot.SpringApplication#logStartupInfo(boolean)
,改用org.springframework.boot.SpringApplication#logStartupInfo(ConfigurationApplicationContext)
。 - 弃用
org.springframework.boot.logging.logback.ApplicationNameConverter
,改用org.springframework.boot.logging.logback.EnclosedInSquareBracketsConverter
。 - 弃用
org.springframework.boot.actuate.autoconfigure.endpoint.expose.EndpointExposure#CLOUD_FOUNDRY
,改用org.springframework.boot.actuate.autoconfigure.endpoint.expose.EndpointExposure#WEB
。 - 弃用
org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails#getUrl()
,改用getUrl(Transport)
。 - 弃用
org.springframework.boot.actuate.autoconfigure.tracing.OpenTelemetryAutoConfiguration
,改用org.springframework.boot.actuate.autoconfigure.tracing.OpenTelemetryTracingAutoConfiguration
。 - 弃用
OtlpAutoConfiguration
,改用OtlpTracingAutoConfiguration
。 - 弃用
management.endpoints.enabled-by-default
和management.endpoint.<id>.enabled
,改用management.endpoints.access.default
和management.endpoint.<id>.access
。 - 弃用
@Endpoint
上的enableByDefault
,改用defaultAccess
。
关注我,紧跟本系列专栏文章,咱们下篇再续!
作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。
各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。
负责:
中央/分销预订系统性能优化
活动&券等营销中台建设
交易平台及数据中台等架构和开发设计
车联网核心平台-物联网连接平台、大数据平台架构设计及优化
LLM Agent应用开发
区块链应用开发
大数据开发挖掘经验
推荐系统项目
目前主攻市级软件项目设计、构建服务全社会的应用系统。
参考:
- 编程严选网
本文由博客一文多发平台 OpenWrite 发布!
相关文章:
Spring Boot 3.4 正式发布,结构化日志!
1 从 Spring Boot 3.3 升级到 3.4 1.1 RestClient 和 RestTemplate 新增对 RestClient 和 RestTemplate 自动配置的支持,可用 Reactor Netty 的 HttpClient 或 JDK 的 HttpClient。支持的客户端优先级: Apache HTTP Components (HttpComponentsClient…...
技术文档,they are my collection!
工作 今天这篇文章,献给一直撰写技术文档的自己。我自认为是公司中最爱写文档的人了,我们是一个不到40人的小公司,公司作风没有多么严谨,领导也不会要求我们写技术文档。但是从入职初至今,我一直保持着写技术文档…...
详解Qt之QtMath Qt数学类
文章目录 QtMath详解前言QtMath简介QtMath中的函数1. 三角函数1.1 qSin1.2 qCos 2. 指数与对数函数2.1 qExp2.2 qLn 3. 幂运算与平方根3.1 qPow3.2 qSqrt QtMath的优势1. 一致性与跨平台支持2. 与Qt生态系统集成3. 简洁性 总结 QtMath详解 前言 在C的开发中,数学运…...
人工智能与人类:共创未来的新篇章
数年前,当人工智能还停留在实验室的时候,很少有人能想到它会如此迅速地融入我们的日常生活。如今,从手机上的语音助手,到自动驾驶汽车,从智能家居到医疗诊断,AI的身影无处不在。这让我想起了20世纪初电力普…...
4.6 JMeter HTTP信息头管理器
欢迎大家订阅【软件测试】 专栏,开启你的软件测试学习之旅! 文章目录 前言1 HTTP信息头管理器的位置2 常见的HTTP请求头3 添加 HTTP 信息头管理器4 应用场景 前言 在 JMeter 中,HTTP信息头管理器(HTTP Header Manager)…...
非交换几何与黎曼ζ函数:数学中的一场革命性对话
非交换几何与黎曼ζ函数:数学中的一场革命性对话 非交换几何(Noncommutative Geometry, NCG)是数学的一个分支领域,它将经典的几何概念扩展到非交换代数的框架中。非交换代数是一种结合代数,其中乘积不是交换性的&…...
【设计模式】【行为型模式(Behavioral Patterns)】之观察者模式(Observer Pattern)
1. 设计模式原理说明 观察者模式(Observer Pattern) 是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式非常适合处理事件驱动系统&a…...
文件导入-使用java反射修改日期数据
文件导入时,时间类型通常不能直接导出,以下方法为批量处理类中日期类型转字符串类型。 Date/Datetime --> String(yyyy-mm-dd)Field[] declaredFields HrAviationstudentMonitorDTO.class.getDeclaredFields(); for (Field field : declaredFields) …...
【网络安全设备系列】10、安全审计系统
0x00 定义: 网络安全审计系统针对互联网行为提供有效的行为审计、内容审计、行为报警、行为控制及相关审计功能。从管理层面提供互联网的 有效监督,预防、制止数据泄密。满足用户对互联网行为审计备案及 安全保护措施的要求,提供完整的上网记录…...
Apache Maven Assembly 插件简介
Apache Maven Assembly 插件是一个强大的工具,允许您以多种格式(如 ZIP、TAR 和 JAR)创建项目的分发包。 该插件特别适用于将项目与其依赖项、配置文件和其他必要资源一起打包。 通过使用 Maven Assembly 插件,您可以将项目作为…...
ReentrantLock(可重入锁) Semaphore(信号量) CountDownLatch
目录 ReentrantLock(可重入锁) &Semaphore(信号量)&CountDownLatchReentrantLock(可重入锁)既然有了synchronized,为啥还要有ReentrantLock?Semaphore(信号量)如何确保线程安全呢?CountDownLatch ReentrantLock(可重入锁) &Semaphore(信号量…...
计算机网络习题解答--个人笔记(未完)
本篇文章为关于《计算机网络-自顶向下方法第七版》的阅读总结和课后习题解答(未完待续) 第二章: cookie:(这里是比较老版本的HTTP,具体HTTPs是怎么实现的不是很清楚)cookie的原理其实很简单。就是在HTTP消息头上又多…...
java虚拟机——频繁发生Full GC的原因有哪些?如何避免发生Full GC
什么是Full GC Full GC(Full Garbage Collection)是Java垃圾收集过程中的一种形式,它涉及整个堆内存(包括年轻代和老年代)以及方法区的垃圾收集。Full GC是一个相对重量级的操作,因为它需要遍历和回收整个…...
python学习笔记(12)算法(5)迭代与递归
一、迭代 迭代(iteration)是一种重复执行某个任务的控制结构。在迭代中,程序会在满足一定的条件下重复执行某段代码,直到这个条件不再满足。 迭代通常用于解决需要逐步推进的计算问题,例如遍历数组、计算阶乘等。迭代…...
从零开始:Linux 环境下的 C/C++ 编译教程
个人主页:chian-ocean 文章专栏 前言: GCC(GNU Compiler Collection)是一个功能强大的编译器集合,支持多种语言,包括 C 和 C。其中 gcc 用于 C 语言编译,g 专用于 C 编译。 Linux GCC or G的安…...
Rust学习(十):计算机科学简述
Rust学习(十):计算机科学简述 在计算机技术这片广袤的领域中,深入理解其内在机制与逻辑需要付出诸多努力。 学习基础知识是构建计算机技术能力大厦的基石,而这一过程往往漫长而艰辛。只有在对基础知识有了扎实的掌握…...
【西瓜书】剪枝与样本值处理——预剪枝、后剪枝、连续值、缺失值
目录 预剪枝 后剪枝 处理连续值 处理缺失值 剪枝(pruning)是决策树学习算法对付“过拟合”的主要手段。 在决策树学习过程中,有时会造成决策树分枝过多,就可能造成过拟合,可通过主动去掉一些分支来降低过离合的风…...
NLP 1、人工智能与NLP简介
人人都不看好你,可偏偏你最争气 —— 24.11.26 一、AI和NLP的基本介绍 1.人工智能发展流程 弱人工智能 ——> 强人工智能 ——> 超人工智能 ① 弱人工智能 人工智能算法只能在限定领域解决特定的问题 eg:特定场景下的文本分类、垂直领域下的对…...
常见线程安全问题之Double Checked Locking
创作内容丰富的干货文章很费心力,感谢点过此文章的读者,点一个关注鼓励一下作者,激励他分享更多的精彩好文,谢谢大家! 双重锁定检查(Double Checked Locking,下称 DCL)是并发下实现懒…...
Redis(非关系型数据库)的作用 详细解读
edis(Remote Dictionary Server)是一个开源的、高性能的、基于内存的数据结构存储系统。它具有极高的读写性能,并且能够支持多种数据结构的存储。Redis 最初的设计目标是作为一个缓存解决方案,但随着其功能的不断扩展,…...
互联网视频推拉流EasyDSS视频直播点播平台视频转码有哪些技术特点和应用?
视频转码本质上是一个先解码再编码的过程。在转码过程中,原始视频码流首先被解码成原始图像数据,然后再根据目标编码标准、分辨率、帧率、码率等参数重新进行编码。这样,转换前后的码流可能遵循相同的视频编码标准,也可能不遵循。…...
python之多元线性回归
目录 前言实战 前言 多元线性回归是回归分析中的一种复杂模型,它考虑了多个输入变量对输出变量的影响。与一元线性回归不同,多元线性回归通过引入多个因素,更全面地建模了系统关系。 多元线性回归模型的表达式为: f ( X ) K T …...
学习threejs,使用设置lightMap光照贴图创建阴影效果
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshLambertMaterial…...
一,SQL注入解题(猫舍)
封神台 第一章:为了女神小芳! Tips: 通过sql注入拿到管理员密码! 尤里正在追女神小芳,在得知小芳开了一家公司后,尤里通过whois查询发现了小芳公司网站 学过一点黑客技术的他,想在女神面前炫炫技。于是他…...
海康大华宇视视频平台EasyCVR私有化部署视频平台海康ISUP是什么?如何接入到EasyCVR?
在现代安防领域,随着技术的发展和需求的增加,对于视频监控系统的远程管理和互联互通能力提出了更高的要求。海康威视的ISUP协议(以及功能相似的EHOME协议)因此应运而生,它们为不具备固定IP接入的设备提供了一种有效的中…...
Java ArrayList 与顺序表:在编程海洋中把握数据结构的关键之锚
我的个人主页 我的专栏:Java-数据结构,希望能帮助到大家!!!点赞❤ 收藏❤ 前言:在 Java编程的广袤世界里,数据结构犹如精巧的建筑蓝图,决定着程序在数据处理与存储时的效率、灵活性以…...
windows下安装wsl的ubuntu,同时配置深度学习环境
写在前面,本次文章只是个人学习记录,不具备教程的作用。个别信息是网上的,我会标注,个人是gpt生成的 安装wsl 直接看这个就行;可以不用备份软件源。 https://blog.csdn.net/weixin_44301630/article/details/1223900…...
开展网络安全成熟度评估:业务分析师的工具和技术
想象一下,您坐在飞机驾驶舱内。起飞前,您需要确保所有系统(从发动机到导航工具)均正常运行。现在,将您的业务视为飞机,将网络安全视为飞行前必须检查的系统。就像飞行员依赖检查表一样,业务分析师使用网络安全成熟度评估来评估组织对网络威胁的准备程度。这些评估可帮助…...
Maven Surefire 插件简介
Maven Surefire 插件是 Maven 构建系统中的一个关键组件,专门用于在构建生命周期中执行单元测试。 它通常与 Maven 构建生命周期的测试阶段绑定,确保所有单元测试在项目编译后和打包前被执行。 最新版本 Maven Surefire 插件的最新版本为 3.5.2。 使…...
基于微信小程序的平价药房管理系统+LW参考示例
1.项目介绍 系统角色:管理员、医生、普通用户功能模块:用户管理、医生管理、药品分类管理、药品信息管理、在线问诊管理、生活常识管理、日常提醒管理、过期处理、订单管理等技术选型:SpringBoot,Vue,uniapp等测试环境…...
网站建设项目团队/网络营销案例分析论文
删除 Microsoft SQL Server 2000 前应考虑的事项 删除 SQL Server 的步骤 删除 SQL Server 的特定实例 删除 SQL Server 的所有已知实例 删除 SQL Server 的默认实例 删除 SQL Server 的命名实例 如何包含全文检索删除 重新安装 SQL Server 前删除临时文件夹中的内容 参考 这篇…...
极验验证 wordpress/中山排名推广
文章目录0x01 DLL简介0x02 DLL 调用0x03 与 lib 文件区别0x04 DLL 编写0x01 DLL简介 动态链接库(Dynamic-Link-Library,缩写dll), 是微软公司在微软视窗操作系统中实现共享函数库概念的一种实现方式。这些库函数的扩展名是 .DLL、.OCX&am…...
wordpress后台打开缓慢/seo优化关键词放多少合适
点击查看全文 根据Stack Overflow流量分析了Python及其他一些编程语言的发展情况,同时也对高收入国家与非高收入国家的情况进行了对比。 我们最近的研究表明,富裕国家(世界银行定义为高收入国家)喜欢研究的技术与其他国家的不同。…...
wordpress好看的自定义页面模版/湖南网站seo推广
我用的是沙箱环境做的测试, 步骤如下: 获取配置信息 点击进入网站, 当然在此之前要先申请个沙箱应用 下图是获取到 APPID, 后面会用到 下面是获取到公钥和私钥, 由于我之前设置过公钥, 如果是刚刚创建的沙箱应用, 那么可能和我的页面稍有不同, 但是只需要按照提示操作获取公…...
wordpress只更换域名/标题优化怎么做
Linux的压力测试软件 工具: Ab 一般这个压力测试工具是在你安装httpd系统包的时候已经是自带的,我们可以通过 rpm –ql httpd |less 这个指令来查看自己的软件包里面是否存在这样的一个包 /usr/bin/ab Ab [option][http[s] //hostname [࿱…...
网站做外链怎么样/专业软文发布平台
使用Submit()过程,工作被正常地计划好。 这个过程有五个参数:job、what、next_date、interval与no_parse。 PROCEDURE Submit ( job OUT binary_ineger, What IN varchar2, next_date IN date, interval IN varchar2, no_parse IN booe…...